题目:《编程之美》 P163
class Matrix
{
public:
unsigned int a11, a12, a21, a22;
Matrix(int a, int b, int c, int d) :a11(a), a12(b), a21(c), a22(d){}
//重载矩阵的乘法
Matrix operator*(const Matrix &other)
{
Matrix r(0,0,0,0);
r.a11 = a11*other.a11 + a12*other.a21;
r.a12 = a11*other.a12 + a12*other.a22;
r.a21 = a21*other.a11 + a22*other.a21;
r.a22 = a21*other.a12 + a22*other.a22;
return r;
}
};
//计算矩阵A的m次方
Matrix MatrixPow(const Matrix &A,unsigned int m)
{
Matrix res(1, 0, 0, 1);//单位矩阵
Matrix cur = A;
while (m)
{
if (m & 1)
res = res*cur;
cur = cur*cur;
m = m >> 1;
}
return res;
}
unsigned int Fibonacci(int n)
{
if (n < 0)
throw new exception;
if (n == 0 || n == 1)
return n;
Matrix A(1, 1, 1, 0);
Matrix r = MatrixPow(A, n - 1);
return r.a11;
}