洛谷上的一个水题,练练高精度。
很容易可以看出来题目就是在要求我们求一个斐波那契数列,但是可能数据范围过大,所以需要通过高精度来解决,看了很多复杂的高精的对这题的写法,但是我觉得这题还是可以有更加简洁的写法的。
首先,这题是有递推式的,f[n]=f[n-2]+f[n-1]。所以可以模拟这个递推过程,这个递推过程每次只需要两个数,而且知道的其中一个数是上一步已知的一个数和上一步计算出来的一个结果。再者,就需要思考这个递推过程需要多少步骤了,可以发现,要求出f[n],就需要n-3+1次循环,循环从3开始,当n<3时,输出的结果就是n。
接下来就贴代码吧:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[50005],b[50005],ans[50005],n,nn=1;
void fibo()
{
a[1]=1,b[1]=2;
for(int i=3;i<=n;i++)
{//表示增加的次数
for(int j=1;j<=nn;j++) ans[j]=a[j]+b[j];
for(int j=1;j<=nn;j++)
{
if(ans[j]>9)
{
ans[j+1]+=ans[j]/10;
ans[j]%=10;
if(j==nn) nn++;
}
}
for(int j=1;j<=nn;j++)
a[j]=b[j];
for(int j=1;j<=nn;j++)
b[j]=ans[j];
}
}
int main()
{
scanf("%d",&n);
if(n<3)
printf("%d",n);
else
{
fibo();
for(int i=nn;i>0;i--)
printf("%d",ans[i]);
}
system("pause");
return 0;
}