遇到高精度的题目,曾经是多么的不快,可是一次又一次硬着头皮写了过后,觉得,高精度的题目也想像中的那么烦……
这道大斐波数,更是乌龙,原来打算从右边找到不为0的位置来确定长度,不慎将 “!=” 写成了 “==” ,奇迹的是竟然AC了!
后来发现,把数为0的位也相加,不影响结果,还省去了求长度的麻烦,当然,占的内存多了点,哈哈!
#include <iostream>
#include <string.h>
using namespace std;
int f[5010][1010]; //第1个5010用来存5010个斐波那契数(测试可知第5000项已超过了1000位),第2个1010表示给每个斐波那契数开1010位
int main()
{
int i, j;
memset(f, 0, sizeof(f));
f[1][0] = 1; //给第1个斐波那契数置数
f[2][0] = 1; //给第2个斐波那契数置数
for(i = 3; i < 5010; i++) //从第3项开始,用前2项相加
{
int C = 0; //C表示进位,开始设为0
for(j = 0; j < 1001; j++)
{
f[i][j] = (f[i-2][j] + f[i-1][j] + C) % 10; //%10后就是这一位该有的数字
C = (f[i-2][j] + f[i-1][j] + C) / 10; //相加产生的进位
}
}
int a;
while(cin>>a)
{
for(j = 1001; j >= 0; j--) //寻找最高位
if(f[a][j] != 0)
break;
for(; j >= 0; j--)
cout<<f[a][j];
cout<<endl;
}
return 0;
}