您的位置:首页 > 其它

用log(n)时间复杂度解决Fibonacci问题

2012-07-22 13:21 323 查看
#include <cstdio>

class Matrix
{
public:
long mat[2][2];

Matrix(const Matrix&);
Matrix(long, long, long, long);
Matrix& operator=(const Matrix&);
friend Matrix operator*(const Matrix& lhs, const Matrix& rhs)
{
Matrix ret(0, 0, 0, 0);
ret.mat[0][0] = lhs.mat[0][0] * rhs.mat[0][0] + lhs.mat[0][1] * rhs.mat[1][0];
ret.mat[0][1] = lhs.mat[0][0] * rhs.mat[1][0] + lhs.mat[0][1] * rhs.mat[1][1];
ret.mat[1][0] = lhs.mat[1][0] * rhs.mat[0][0] + lhs.mat[1][1] * rhs.mat[1][0];
ret.mat[1][1] = lhs.mat[1][0] * rhs.mat[1][0] + lhs.mat[1][1] * rhs.mat[1][1];
return ret;
}
};

Matrix::Matrix(long a, long b, long c, long d)
{
this->mat[0][0] = a;
this->mat[0][1] = b;
this->mat[1][0] = c;
this->mat[1][1] = d;
};

Matrix::Matrix(const Matrix& rhs)
{
this->mat[0][0] = rhs.mat[0][0];
this->mat[0][1] = rhs.mat[0][1];
this->mat[1][0] = rhs.mat[1][0];
this->mat[1][1] = rhs.mat[1][1];
};

Matrix& Matrix::operator=(const Matrix& rhs)
{
this->mat[0][0] = rhs.mat[0][0];
this->mat[0][1] = rhs.mat[0][1];
this->mat[1][0] = rhs.mat[1][0];
this->mat[1][1] = rhs.mat[1][1];

return *this;
};

Matrix power(const Matrix& x, int n)
{
if(n == 1)
return x;
if(n % 2 == 0)
return power(x * x, n / 2);
else
return power(x * x, n / 2) * x;
};

long fib(int n)
{
Matrix mat(1, 1, 1, 0);
mat = power(mat, n - 1);
return mat.mat[0][0];
};

int main()
{
int res = fib(3);

return 0;
}


主要思想为 矩阵乘法

题目: http://www.careercup.com/question?id=14237663

参考:http://songyishan.iteye.com/blog/1166608

另外这个算法没有仔细看,不知道是否可以:http://www.cnblogs.com/end/archive/2011/10/26/2225723.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matrix include 算法 c
相关文章推荐