1. 程式人生 > >11.28 毛學姐大戰學渣

11.28 毛學姐大戰學渣

Description

又到了毛學姐屠殺學渣的時候了,學渣根據實力不同從 Lv1 依次向上提升,毛學姐每屠殺一個學渣就會不斷地提升自己的實力,從而挑戰更高等級的學渣,他按照這樣的方式屠殺學渣:1,1,2,1,1,1,3,1,1,1,1,4,1,1,1,1,1,5…1,1,2,1,1,1,3,1,1,1,1,4,1,1,1,1,1,5… 第一二天他屠殺2個Lv1的學渣,然後第三天能夠屠殺一個LV2的學渣,接下來,毛學姐再殺33個LV1的學渣【為了恢復體力】,然後殺死一個LV3的學渣,如此往復。但是毛學姐數學不好,殺著殺著就忘了今天該輪到等級多少的學渣了,請你幫他計算一下。

Input

有多組測試樣例。輸入一個正整數數N,代表要殺的第N個學渣。(0<N<100000)

Output

輸出第N個學渣的等級
思路:首先說一下最容易想到的思路,建一個長度100000的陣列,然後用迴圈給陣列賦值。但陣列長度太長,記憶體太大,程式碼如下;

#include <stdio.h>
int main()
{
    int l[100000];
    long int n,b;
    int a=2;
    b=0;
    while(scanf("%ld",&n)!=EOF){
            while(b<n){
            int i;
        for(i=0;i<=a;i++){
                l[b]=1;
                if(i==a){
                    l[b]=a;
                }
            b=b+1;
        }
        a=a+1;
    }
        printf("%d\n",l[n-1]);
    }
    return 0;
}

以上程式碼記憶體太大,能得出結果但不可行,同樣的思路,直接去算這個數,假設1,1,2為一組,1113為一組,依此類,用N從3開始減,減到N小於等於0,確定N在哪組;如果減到最後為0,則為最後那個數,否則為1

#include <stdio.h>
int main()
{
    long int n;
    int a=2;
    int b=3;
    while(scanf("%ld",&n)!=EOF){
    int a=2;
    int b=3;
    while(n>0){
        n=n-b;
        a++;
        b++;
    }
    if(n==0){
        printf("%d\n",a-1);
    }else{
        printf("%d\n",1);
    }
    }
    return 0;
}