【题目描述】
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
【输入】
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
【输出】
输出为N行,每行为对应的f(Pi)。
【样例输入 】
5
1
2
3
4
5
【样例输出 】
1
1
2
3
5
【分析】
每次做了大数相加之后任然保留倒序的数存在表里面,这样以便下次相加的时候直接加,而不用把顺序翻来翻去很麻烦,这样只要在输出的时候把顺序倒过来就可以 了.
在二维数组a[i][j]中竖列下表i的值就是斐波那契数列中的n的值(n表示数列第n个数的位置n)。纵向下标j储存第n个菲波数的每一位的值。
【补充】
大数相加:https://blog.csdn.net/fesdgasdgasdg/article/details/80953829
高精度:https://blog.csdn.net/qq_44274276/article/details/104135218
https://blog.csdn.net/qq_44274276/article/details/104378779
【AC的代码】
#include<stdio.h>
#include<string.h>
int a[1010][550];
void fib()
{
int s,c;
a[1][0]=1;a[2][0]=1;
for(int i=3;i<1001;i++)
{
c=0;
for(int j=0;j<=500;j++) /*以下步骤模拟大数计算,初始化斐波那契数列*/
{
s=a[i-1][j]+a[i-2][j]+c;
a[i][j]=s%10;
c=s/10;
}
}
}
int main()
{
fib();
int n,p,i;
scanf("%d",&n);
while(n--)
{
scanf("%d",&p);
for(i=500;i>=0;i--) /*找到数值的最后一位 */
{
if(a[p][i])
break;
}
for(;i>=0;i--)// 注意上面的函数计算的值的数位是逆序的
{
printf("%d\n",a[p][i]);
}
}
return 0;
}