题目:定义Fibonacci数列
f(1)=0;
f(2)=1;
...
f(n)=f(n-1)+f(n-2);
输入n,用最快的方法求该数列的第n项;
分析:略
代码:
struct Matri2By2//定义2*2矩阵
{
Matri2By2(unsigned long m00,
unsigned long m01,
unsigned long m10,
unsigned long m11):m_00(m00),m_01(m01),m_10(m10),m_11(m11)
{};//结构体的构造函数
unsigned long m_00;
unsigned long m_01;
unsigned long m_10;
unsigned long m_11;
};
Matri2By2 MatriMultiply(const Matri2By2& A,const Matri2By2& B);//矩阵相乘
Matri2By2 MatriPower(int n);//(1,1,1,0)矩阵的n次幂
void printMatri2By2(const Matri2By2& A);//打印矩阵
long long Fibonacci(unsigned int n);//求Fibonacci数列
Matri2By2 MatriMultiply(const Matri2By2& A,const Matri2By2& B)
{
return Matri2By2(A.m_00*B.m_00+A.m_01*B.m_10,
A.m_00*B.m_01+A.m_01*B.m_11,
A.m_10*B.m_00+A.m_11*B.m_10,
A.m_10*B.m_01+A.m_11*B.m_11);
}
Matri2By2 MatriPower(int n)//分治
{
assert(n>0);
Matri2By2 matri(0,0,0,0);
if(n==1)
matri=Matri2By2(1,1,1,0);
else if((n&1)==0)
{
matri=MatriPower(n/2);
matri=MatriMultiply(matri,matri);
}else{
matri=MatriPower((n-1)/2);
matri=MatriMultiply(matri,matri);
matri=MatriMultiply(matri,Matri2By2(1,1,1,0));
}
return matri;
}
void printMatri2By2(const Matri2By2& A)
{
cout << A.m_00 << "\t" << A.m_01 <<"\n";
cout << A.m_10 << "\t" << A.m_11 <<"\n";
}
long long Fibonacci(unsigned int n)
{
if(n==1)
return 0;
else if(n==2)
return 1;
else{
Matri2By2 m=MatriPower(n-1);
return m.m_00;
}
}