Hat's Fibonacci

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5705    Accepted Submission(s): 1898


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
4203968145672990846840663646
Note: No generated Fibonacci number in excess of 2005 digits will be in the test data, ie. F(20) = 66526 has 5 digits.
 

 

Author
戴帽子的
 

 

Recommend
Ignatius.L
 
代码:

     
  思路:由于这样的斐波那契数列越向后,数越大。就会变成大数问题,因此我们把结果对10000取余,
  分割成每四个数字一组,这样就可以变大数为用已知的变量储存,从而化 复杂为简单。
      #include "stdio.h"
#define N 10000
#define M  800
int a[N][M]={0};
int main()
{   int i,j,k=0,m,n;

    a[1][0]=1;
    a[2][0]=1;
    a[3][0]=1;
    a[4][0]=1;
   
    for(i=5;i<N;i++)
     for(j=0;j<M;j++)
      {k=k+a[i-1][j]+a[i-2][j]+a[i-3][j]+a[i-4][j];
        a[i][j]=k%10000;                     //
        k=k/10000;
      }
      
          while(k)            //为保证所得每一项数都以 分成每四个一组储存完正
        {a[i][j++]=k%10000;    
        k=k/10000;
        }
      

         
      while(scanf("%ld",&n)>0)
      {
          for(i=M-1;i>=0;i--)
            if(a[n][i]!=0)
                break;
            //    printf("%d   ",i);
        printf("%ld",a[n][i]);
        for(i--;i>=0;i--)
            printf("%4.4ld",a[n][i]); //注意%4.4ld 与 %04ld 输出 方式一样如下测试程序
        printf("\n");
                     
                                
            // i=M;                   
         /* for(i=M;i>=0;i--)
          if(a[n][i]!=0)
            break;
           printf("%d",i);*
            while(a[n][i]==0)
               i--;
                printf("%d",i);
         //printf("%4ld",a[n][i]);
         for(i;i>=0;i--)
         printf("%4ld",a[n][i]);
          printf("\n");*/
      
      }
      return 0;
      }
     
      测试程序:
        #include "stdio.h"
      #include "stdlib.h"
      int main()
      {long x=1;
      printf("%6.6ld",x);
      printf("%06ld",x);
      system ("pause");

}

思索:大数可以考虑分段存储和输出
      
      
     

posted on 2013-07-30 19:23  守护生命的绿荷  阅读(144)  评论(0编辑  收藏  举报