HDOJ 1715 大菲波数 (大数相加)

来源:互联网 发布:淘宝商品资质要填吗 编辑:程序博客网 时间:2024/05/17 06:40

大菲波数

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14814    Accepted Submission(s): 4968


Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
 

Input
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
 

Output
输出为N行,每行为对应的f(Pi)。
 

Sample Input
512345
 

Sample Output
11235
注 - 此题为:HDOJ 1715 大菲波数 (大数相加)

                   大数相加,定义一个二维数组将Fibonacci数值倒着存放,打表后,倒着输出

已AC代码:

#include<cstdio>#include<cstring>#define MAX 300 // 要算到 1000 ,而 1000的Fibonacci的值位数小于 300 int f[MAX*4][MAX],la,lb;  // f 中存的数为 倒着 的 void bignum(int t,int x,int y) // 大数f[t]=f[x]+f[y] {int i,j,len=MAX-1;while(f[x][len]==0)len--; //求 f[x],f[y]长度较大的为 f[x]的长度 for(i=0;i<=len;++i) //大数 相加的过程 {f[t][i]+=f[x][i]+f[y][i];if(f[t][i]>9){f[t][i]-=10;f[t][i+1]+=1;}}}void Fibonacci(){memset(f,0,sizeof(f));f[1][0]=f[2][0]=1;for(int i=3;i<=1000;++i)bignum(i,i-1,i-2); // 调用 求大数f[t]=f[x]+f[y]  }int main(){Fibonacci(); //对 f 打表赋值 int T,n;scanf("%d",&T);while(T--){scanf("%d",&n);int i=MAX-1; // 由于数是倒着的,要找到最高位(即倒着找 第一个不为 0 的下标) while(f[n][i]==0)i--;for(;i>=0;--i) //倒着输出 printf("%d",f[n][i]);printf("\n");}return 0;}

0 0
原创粉丝点击