C언어 금화 문제

목차

1. 주제 소개

2. 주제 요건

3. 문제 해결 아이디어

4. 코드 데모


1. 주제 소개

왕은 충성스러운 기사들에게 임금으로 금화를 주었습니다.

기사는 첫째 날에 금화 1개를 받고, 그 다음 2일(둘째, 셋째 날)에는 매일 두 개의 금화를 받고, 그 다음 3일(넷째, 다섯째, 여섯째 날)에는 세 개의 금화를 받습니다. 매일 금화 ;다음 4일(7일, 8일, 9일, 10일) 동안 매일 4개의 금화를 받았습니다...; 이 급여 분배 모델은 계속됩니다.

연속 N일 동안 매일 N개의 금화를 받은 기사는 연속 N+1일 동안 매일 N+1개의 금화를 받습니다.

지난 K일 동안 기사가 획득한 금화의 개수를 계산하십시오.

제목 출처: Niu Ke BC96  

2. 주제 요건

설명 입력:

입력에는 금화 발행 일수를 나타내는 양의 정수 K가 포함된 한 줄만 있습니다.

출력 설명:

출력은 기사가 받은 금화의 수인 양의 정수를 포함하는 단 한 줄입니다.

3. 문제 해결 아이디어

위의 그림과 같이 삼각형 첨탑과 마찬가지로 각 행의 항목 수는 행의 수와 같고 각 행의 항목 수로 표시되는 금화의 수는 숫자와 같습니다. 행의.

따라서 행수×항목수 문제인 회절, 즉 i * j 또는 i * i    로 구할 수 있다.

따라서 라인의 수를 금화의 수로 설정할 수 있으며, 한 라인의 아이템이 모두 소진되면 다음 라인으로 진입하여 골드 코인의 수를 늘릴 수 있습니다. 며칠. 하루.

그리고 일수가 다가올수록 걸을 수 있는 아이템의 수가 지속적으로 줄어들고 있기 때문에 남은 일수가 이 행의 모든 ​​아이템을 완성할 수 있을지 판단하기 위해 일수를 판단할 필요가 있다.

수학적 모델로 변환:

k를 일 수라고 합니다.

i를 항목의 수라고 하고 i는 금화의 수를 나타내는 행 수를 나타냅니다.

i * i는 한 줄의 모든 항목을 완료하는 금화의 숫자로, 한 줄의 총 금화 수를 나타냅니다.

합계 = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +…

합계 = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +…

4. 코드 데모

int main()
{
    int k;
    int i = 1;
    int result = 0;
    scanf("%d", &k);
    while (k > 0)
    {
        if (k >= i) 
            result += i * i;
        else
            result += k * i;
        k -= i;      //天数在不断的减少
        i++;         //完成 一行后 金币数需要加1
    }
    printf("%d\n", result);
    return 0;
}

//k > = i  表示当天数大于等于项数时,可以走完一行,所以使用 i * i ,行数(金币数) × 项数 

//k < i 表示当天数小于项数时,则要求该项所在的行数(金币数) * 天数 得到剩余天数的所有金币

 

추천

출처blog.csdn.net/2301_76445610/article/details/132148048