void f(int n, int* a)
{
static int A[4]={1,1,1,0};
if(n==1)
return;
f(n/2,a);//计算一半矩阵乘法的结果
int temp[4];
for(int i=0;i<4;i++)
temp[i]=a[i];
for(int i=0;i<2;++i)//获得n/2*2的结果
{
for(int j=0;j<2;++j)
{
a[2*i+j]=0;
for(int k=0;k<2;++k)
a[2*i+j]+=temp[2*i+k]*temp[2*k+j];
}
}
if(n%2!=0)//获得n/2*2+1的结果
{
int temp[4];
for(int i=0;i<4;i++)
temp[i]=a[i];
for(int i=0;i<2;++i)
{
for(int j=0;j<2;++j)
{
a[2*i+j]=0;
for(int k=0;k<2;++k)
a[2*i+j]+=temp[2*i+k]*A[2*k+j];
}
}
}
}
int fib(int n)
{
if(n<1)//参数正确性检查
return -1;
if(n==1 || n==2)
return 1;
else
{
int a[4]={1,1,1,0};
f(n-2,a);
return fib(2)*a[0]+fib(1)*a[2];
}
}
写正确函数需要注意的地方:快速返回斐波那契数的第n项
最新推荐文章于 2022-07-27 21:15:29 发布