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