HDU Hat's Fibonacci 结题报告

来源:互联网 发布:eviews3.1怎么导入数据 编辑:程序博客网 时间:2024/05/20 18:16

Problem Description

A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1.
F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4)
Your task is to take a number as input, and print that Fibonacci number.

 


 

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;
 }
}

 

原创粉丝点击