求Fibonacci數列的三種方法
阿新 • • 發佈:2019-01-31
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 Input1
3
20
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; }