大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
牛客网AC代码:
class Solution {
public:
int Fibonacci(int n) {
if(n <= 0)
return 0;
else if(n == 1)
return 1;
int fir = 0,sec = 1,temp = 0;
for(int i=0;i<n-1;i++){
temp = fir+sec;
fir = sec;
sec = temp;
}
return sec;
}
};
实现代码如下:
#include<iostream>
using namespace std;
//long long 支持64位
//一、递归求解
long long Fibonacci_1(unsigned int n){//注意是unsigned int,不能输入无符号型
if(n == 0)
return 0;
else if(n == 1)
return 1;
return Fibonacci_1(n-1) + Fibonacci_1(n-2);
}
//二、自下而上的算法求解,避免中间结果重复计算
long long Fibonacci_2(unsigned int n){
if(n <= 0)
return 0;
if(n == 1)
return 1;
long long a=0,b=1,c=0;
for(int i=0;i <= n-2;i++){
c = a+b;
a = b;
b = c;
}
return c;
}
//三、通过基阵乘法求解
class Matrix2By2{
public:
Matrix2By2(long long m00,long long m01,long long m10,long long m11);
Matrix2By2 MatrixMultiply(const Matrix2By2 mat2);//计算自身和另外一个矩阵相乘
void show();
friend Matrix2By2 MatrixPower(int n);//友元函数,对特定矩阵求n次方
//计算两个矩阵相乘
friend Matrix2By2 myMatrixMultiply(const Matrix2By2 mat1,const Matrix2By2 mat2);
friend long long Fibonacci_3(unsigned int n);
private:
long long m00 = 0;
long long m01 = 0;
long long m10 = 0;
long long m11 = 0;
};
void Matrix2By2::show(){
cout<<m00<<" "<<m01<<endl;
cout<<m10<<" "<<m11<<endl<<endl;
}
Matrix2By2::Matrix2By2(long long m00,long long m01,long long m10,long long m11){
this->m00 = m00;
this->m01 = m01;
this->m10 = m10;
this->m11 = m11;
}
Matrix2By2 myMatrixMultiply(const Matrix2By2 mat1,const Matrix2By2 mat2){
return Matrix2By2(mat1.m00*mat2.m00 + mat1.m01*mat2.m10,
mat1.m00*mat2.m01 + mat1.m01*mat2.m11,
mat1.m10*mat2.m00 + mat1.m11*mat2.m10,
mat1.m10*mat2.m01 + mat1.m11*mat2.m11);
}
Matrix2By2 MatrixPower(int n){
if(n < 0)
return Matrix2By2(0,0,0,0);
if(n == 0)
return Matrix2By2(1,0,0,0);
if(n == 1)
return Matrix2By2(1,1,1,0);
if(n %2 == 0){
//Matrix2By2 mat= MatrixPower(n/2);
//return myMatrixMultiply(mat,mat);
return myMatrixMultiply( MatrixPower(n/2) , MatrixPower(n/2));
}
else{
//Matrix2By2 mat= MatrixPower((n-1)/2);
//mat = myMatrixMultiply(mat,mat);
//return myMatrixMultiply(mat,Matrix2By2(1,1,1,0));
return myMatrixMultiply( myMatrixMultiply(MatrixPower((n-1)/2) , MatrixPower((n-1)/2) ) , Matrix2By2(1,1,1,0));
}
}
Matrix2By2 Matrix2By2::MatrixMultiply(const Matrix2By2 mat2){
//注意这里是直接返回一个新的矩阵,而不是拿自身计算的结果返回
return Matrix2By2(m00*mat2.m00 + m01*mat2.m10,
m00*mat2.m01 + m01*mat2.m11,
m10*mat2.m00 + m11*mat2.m10,
m10*mat2.m01 + m11*mat2.m11);
}
long long Fibonacci_3(unsigned int n){
Matrix2By2 res = MatrixPower(n-1);//应该输入的是n-1,比如输入9对应n-1 = 8
return res.m00;
}
int main(){
Matrix2By2 mat1(1,1,1,0);
Matrix2By2 mat2(1,1,1,0);
Matrix2By2 resMat = mat1.MatrixMultiply(mat2);
resMat.show();
resMat = resMat.MatrixMultiply(mat1);
resMat.show();
int n;
cout<<"请输入n值:";
cin>>n;
cout<<Fibonacci_1(n)<<endl;
cout<<Fibonacci_2(n)<<endl;
cout<<Fibonacci_3(n)<<endl;
return 0;
}
运行结果如下: