hdu-1715 大斐波数
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项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
5 1 2 3 4 5Sample Output
1 1 2 3 5
解题思路:此题的数值较大,即使无符号long long也难以存下,所以考虑用数组模拟大整数加法计算,代码如下;
#include <iostream> #include <math.h> #include <stdio.h> using namespace std; int a[5000],b[5000],c[5000]; long long d[5000]; void f(int n) { int m=1; a[1]=1; b[1]=1; for(int j=1; j<=n; j++) { for(int i=1; i<=m; i++) { c[i]=a[i]+b[i]; } int te=0,ce; for(int i=1; i<=m; i++) { ce=te+c[i]; c[i]=ce%10; te=ce/10; } while(te) { m++; c[m]=te%10; te/=10; } for(int k=1;k<=m;k++) { a[k]=b[k]; b[k]=c[k]; } } for(int i=m;i>=1;i--) printf("%d",c[i]); printf("\n"); } void inin() { int i; d[1]=1; d[2]=1; for(i=3;i<=1000;i++) d[i]=d[i-1]+d[i-2]; } int main() { int n; inin(); scanf("%d",&n); while(n--) { fill(a+1,a+5000,0); fill(b+1,b+5000,0); fill(c+1,c+5000,0); int x; scanf("%d",&x); if(x>90)///做一个时间上的优化^-^ f(x-2);///为啥是x-2? 看一下f函数..... else printf("%lld\n",d[x]); } return 0; }