程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 斐波那契數列求解

斐波那契數列求解

編輯:C++入門知識

斐波那契數列的定義如下:   當n=0時,F[n]=0;   當n=1時,F[n]=1;   當n>1時,F[n]=F[n-1]+F[n-2];   解法一(動態規劃思想):    

int Fib(int n)  
{  
    int pre1=1;  
    int pre2=0;  
    if(n==0)  
        return 0;  
    if(n==1)  
        return 1;  
    for(int i=2;i<=n;i++)  
   {  
        result=pre1+pre2;  
        pre2=pre1;  
        pre1=result;  
   }  
   return result;  
}  

 

  時間復雜度為O(n);   解法二:分治策略 (F(n),F(n-1))=(F(n-1),F(n-2))*A=...=(F(1),F(0))*A^(n-1);   A={{1,1},{1,0}};   轉化為求矩陣A的冪。   代碼如下:      
#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);  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved