这是数据结构老师布置的一道题:
写一个函数计算斐波那契数列第n项值(n>=1),并通过主函数调用该函数进行测试。
n的测试范围是整数范围。
刚拿到手,理所当然的用了最常用的方法
int Fibonacci(int n)
{
int a[100];
int i;
for(i=1;i<=n;i++){
if(i==1||i==2)
a[i]=1;
else
a[i]=a[i-1]+a[i-2];
}
return a[n-1];
}
但是测试时会发现当n等于47时,运行结果便出现了错误,已经超出精度范围。
换成了long也是只能计算到第46项,
即使换成了double也只能计算到第102项,
那么只能用别的方法了。
计算到后期,相加的两数都非常大,那么可考虑用高精度加法来计算,即,将大数用数组存储,再进行计算。代码如下:
int a[1001][1001];
void Fibonacci(int n)
{
int i,j,sum=0;
memset(a,0,sizeof(a)); //初始化二维数组a
a[1][0]=1;
a[2][0]=1;
for(i=3;i<=n;i++) // i 表示第i个数
{
for(j=0;j<1001;j++)
{
sum+=a[i-1][j]+a[i-2][j];
a[i][j]=sum%10; //将大数倒着存入数组中
sum/=10;
}
}
for(i=1000;i>=0;i--) //遍历数组,找到开始不为0的第一项
{
if(a[n][i])
break;
}
printf("%d",a[n][i--]); // 将大数输出
for(j=i;j>=0;j--)
{
printf("%d",a[n][j]);
}
}