题目描述:
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
用斐波那契数列的通项计算一下,(((1+sqrt(5))/2)^1000-((1-sqrt(5))/2)^1000)/sqrt(5)=4.3*10^208,数据很大,不是一般的数据类型可以存储下的,所以考虑大数计算,用a[1005][300]来存放数列,a[i]表示第i+1个数,AC代码:
#include<stdio.h>
int a[1005][300]={0};
int b[1005];
int main(){
a[0][0]=1;
a[1][0]=1;
b[0]=1;b[1]=1;
for(int i=2;i<1000;i++){
int n=b[i-2],m=b[i-1],flag=0,j;
for(j=0;j<n;j++){
int t=a[i-2][j]+a[i-1][j]+flag;
if(t>9){
flag=1;
a[i][j]=t-10;
}
else {a[i][j]=t;flag=0;}
}
for(;j<m;j++){
int t=a[i-1][j]+flag;
if(t>9){
flag=1;
a[i][j]=t-10;
}
else {a[i][j]=t;flag=0;}
}
if(flag==1) a[i][m++]=1;
b[i]=m;
}
int T;
scanf("%d",&T);
while(T--){
int k,q;
scanf("%d",&k);
for(q=299;q>=0;q--){
if(a[k-1][q]!=0) break;
}
for(;q>=0;q--)
printf("%d",a[k-1][q]);
printf("\n");
}
}