首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

斐波那契据数列求解

2013-09-07 
斐波那契数列求解斐波那契数列的定义如下:当n0时,F[n]0当n1时,F[n]1当n1时,F[n]F[n-1]F[n-2]解法

斐波那契数列求解

斐波那契数列的定义如下:

当n=0时,F[n]=0;

当n=1时,F[n]=1;

当n>1时,F[n]=F[n-1]+F[n-2];

解法一(动态规划思想):

#include<iostream>using namespace std;class Matrix2{public:Matrix2(int a1,int a2,int b1,int b2){m11=a1;m12=a2;m21=b1;m22=b2;}int getm11()const{return m11;}int getm12()const{return m12;}int getm21()const{return m21;}int getm22()const{return m22;}private:int m11;int m12;int m21;int m22;};Matrix2 MatrixPow(const Matrix2& m,int n);int Fib(int n);int main(){int n;cin>>n;cout<<Fib(n)<<endl;return 0;}Matrix2 matmultiply(const Matrix2& mat1,const Matrix2& mat2){int m11=mat1.getm11()*mat2.getm11()+mat1.getm12()*mat2.getm21();int m12=mat1.getm11()*mat2.getm12()+mat1.getm12()*mat2.getm22();int m21=mat1.getm21()*mat2.getm11()+mat1.getm22()*mat2.getm21();int m22=mat1.getm21()*mat2.getm12()+mat1.getm22()*mat2.getm22();return Matrix2(m11,m12,m21,m22);}Matrix2 MatrixPow(const Matrix2& mat,int n){Matrix2 result(1,0,1,0);Matrix2 tmp=mat;for(; n; n>>=1){if(n&1)result=matmultiply(result,tmp);tmp=matmultiply(tmp,tmp);}return result;}int Fib(int n){if(n==0)return 0;else if(n==1)return 1;Matrix2 mat(1,1,1,0);Matrix2 an=MatrixPow(mat,n-1);return an.getm11();}
时间复杂度为O(nlogn);



热点排行