1. 程式人生 > >求Fibonacci數列的三種方法

求Fibonacci數列的三種方法

Fibonacci數列:0,1,1,2,3,5,8,13。。。。

第一招:遞推法;

#include<cstdio>
int f[47];
int main()
{
    int n;
    scanf("%d",&n);
    f[0]=0;
    f[1]=1;
    f[2]=1;
    for(int i=3;i<=n;i++)
        f[i]=f[i-1]+f[i-2];
    printf("%d\n",f[n]);
    return 0;
}

第二招:不斷變換初始;

#include <cstdio>
int main()
{
    int f1,f2,f3,t,n;

    while(~scanf("%d",&n))
    {
        f1=1;
        f2=1;
       for(int i=3;i<=n;i++)
       {
           f3=f1+f2;
           t=f2;
           f2=f3;
           f1=t;
       }
       if(n==1||n==2) puts("1");
       else if(n==0)  puts("0");
       else printf("%d\n",f3);
    }
    return 0;
}

第三招:快速冪;

Description

設Fibonacci數列定義為:

請用矩陣快速冪方法,即利用以下公式求Fibonacci數列第n項。

本題不涉及高精度數。

Input

每行一個整數 i ,表示Fibonacci數列的第i項。 i < 47

Output

對每個整數i,輸出Fibonacci數列的第i項。

Sample Input

1
3
20

Sample Output

1
2
6765


#include<cstdio>
int f[2][2];
int main()
{
   int n;
   while(~scanf("%d",&n))
   {
       //注意定義在while內否則出錯
     int f1[2][2]={{0,1},{1,1}};
      int f0[2][2]={{1,1}};//自遍歷找出初始
      //int f[2][2];
      while(n>0)
      {
          if(n&1)
          {
              f[0][0]=f1[0][0]*f0[0][0]+f1[0][1]*f0[1][0];
              f[0][1]=f1[0][0]*f0[0][1]+f1[0][1]*f0[1][1];
              f[1][0]=f1[1][0]*f0[0][0]+f1[1][1]*f0[1][0];
              f[1][1]=f1[1][0]*f0[0][1]+f1[1][1]*f0[1][1];
              f0[0][0]=f[0][0];
              f0[0][1]=f[0][1];
              f0[1][0]=f[1][0];
              f0[1][1]=f[1][1];
          }
          n>>=1;//除以2;
          //更新
           f[0][0]=f1[0][0]*f1[0][0]+f1[0][1]*f1[1][0];
           f[0][1]=f1[0][0]*f1[0][1]+f1[0][1]*f1[1][1];
           f[1][0]=f1[1][0]*f1[0][0]+f1[1][1]*f1[1][0];
           f[1][1]=f1[1][0]*f1[0][1]+f1[1][1]*f1[1][1];
        f1[0][0]=f[0][0];
        f1[0][1]=f[0][1];
        f1[1][0]=f[1][0];
          f1[1][1]=f[1][1];
      }
      printf("%d\n",f0[1][1]);
   }
   return 0;
}