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

猜你喜欢

转载自blog.csdn.net/honeycomb_1/article/details/80521176