Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1.
|
Input Each line will contain an integers. Process to end of file.
|
Output For each case, output the result in a line.
|
Sample Input 100
|
Sample Output 4203968145672990846840663646Note:No generated Fibonacci number in excess of 2005 digits will be in the test data, ie. F(20) = 66526 has 5 digits. |
题目要求的就是f[n]=f[n-1]+f[n-2]+f[n-3]+f[n-4],就这样而已,但是因为数字太大了,题目最后也讲了,f[n]不超过2005个数字,2005个数字,那肯定得要用数组进行大数加法运算了,与以前的几乎一样,特别的是如果一个a[i]存一个位,数组也非常大,开不到这么大的数组,所以要一个a[i]存多个数字,想的时候我有担心过多个数字会不会导致存贮的时候顺序改变,例如如果一个a[i]存一个数 ->27+98:
没有任何问题;但是当一个a[i]存2个数字,还是27+98吧:c[0]存25,事实表明输出过程c[1]->c[0]为125,结果同样正确,不用担心a[i]存的数位会不会影响到c[i]中的数字顺序,不应该受到a[i]存一个数字这样情况的影响,下意识认为c[0]应该存放52,理解这一点之后和大数加法就像平时那样做就行了,除此2之外,数组大小也是个问题,由其它结题报告知道,数字超过2005个时候大约有8000个数,也就是要开个一维为8000+的二维数组来存放每个数,打表输出要求的数就OK;
贴代码:
#include<iostream>
using namespace std;
#define mod 100000000
int a[8050][350]={0};
void bignum_add()
{
int k,i,j;
for(i=5;i<8050;i++)
for(j=0;j<350;j++)
{
a[i][j]+=a[i-1][j]+a[i-2][j]+a[i-3][j]+a[i-4][j];
if(a[i][j]>mod)
{
a[i][j+1]=a[i][j]/mod;
a[i][j]%=mod;
}
}
}
void main()
{
int i,n,j;
a[1][0]=1;
a[2][0]=1;
a[3][0]=1;
a[4][0]=1;
bignum_add();
while(cin>>n)
{
for(i=349;i>=0;i--)
if(a[n][i]!=0)
break;
printf("%d",a[n][i]);
for(j=i-1;j>=0;j--)
printf("%08d",a[n][j]);
cout<<endl;
}
}