ZQUOJ1398 Fibonacci Numbers解题报告

    技术2022-06-08  53

    Fibonacci Numbers

    memory limit: 65536KB time limit: 500MS

    accept: 22 submit: 29

    Description

    A Fibonacci sequence is calculated by adding the previous two members of the sequence, with the first two members being both 1.

    f(1) = 1, f(2) = 1, f(n > 2) = f(n - 1) + f(n - 2)

    Your task is to take a number as input, and print that Fibonacci number.

    Input

    One integer i

    Output

    Output the i-th Fibonacci number.

    Sample Input

    100

    Sample Output

    354224848179261915075

    Hint

    No generated Fibonacci number in excess of 1000 digits will be in the test data, i.e. f(20) = 6765 has 4 digits.

    Source

    ZQUCPC个人赛5

    Author

    Waterloo local

    题意:

    输出斐波那契数列的第n项。

     

    错误做法:

    打表时数组开小了。

     

    问题的分析与解题思路:

    这个题以前做过,需要用高精度解决。预先打表,然后根据输入的数输出即可。

    AC代码:

    #include<stdio.h> #include<string.h> int a[10000][300]; int main() { int i,j,n,b,k,s; //memset(a[1],0,sizeof(a[1])); //memset(a[2],0,sizeof(a[2])); a[1][299]=1; a[2][299]=1; //初始化第一二项,他们的值为1 for(i=3;i<10000;i++) { //memset(a[i],0,sizeof(a[1])); for(j=299;j>0;j--) { a[i][j]+=a[i-1][j]+a[i-2][j];//每项的每一位都是由前两项对应位置的数值相加得到的。 while(a[i][j]>9999) //每个最大存9999,超出的前一位加1 { a[i][j]-=10000; a[i][j-1]++; } } } while(scanf("%d",&n)!=EOF) { for(i=1;i<300;i++) //找到该项的第一个非0位置 if(a[n][i]) break; for(j=i;j<300;j++) { if(j!=i) //对除第一个位置的其他位置,如果不足四位,说明之前的为0,则用0补足四位。 { b=a[n][j]; s=0; while(b) { s++; b/=10; } if(s<4) for(k=0;k<4-s;k++) printf("0"); } printf("%d",a[n][j]); } printf("/n"); } return 0; }

     

    算法复杂度分析:

    时间复杂度是o(n^2)

    算法的优缺点分析和改进:

    可以提高数组的利用率,或者其他的高精度保存方法来提高效率。

     

    总结:

    水题一道,之前做这题时学会了高精度的处理。


    最新回复(0)