斐波那契额数列
前言
采用三种方法求斐波那契数列,迭代法,公式法,矩阵快速幂加高精度(偷偷告诉你:可以精确求到一万位斐波那契数)
一、迭代法`
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a,b,n;
cin>>n;
a=b=1;
for(int i=3;i<=n;++i){
b=a+b;
a=b-a;
}
cout<<b<<endl;
return 0;
}
二、公式法估算
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
double t=sqrt(5);
cout<<(int)((pow((1+t)/2,n)-pow((1-t)/2,n))/t)<<endl;
return 0;
}
三.矩阵快速幂加高精度
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
string add_big(string a,string b){
vector<int>A,B,C;
for(int i=a.size()-1;i>=0;--i)A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;--i)B.push_back(b[i]-'0');
for(int i=0,t=0;i<A.size()||i<B.size()||t;++i){
if(i<A.size())t+=A[i];
if(i<B.size())t+=B[i];
C.push_back(t%10);
t/=10;
}
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
string mul_big(string a,int b){
vector<int>A,C;
for(int i=a.size()-1;i>=0;--i)A.push_back(a[i]-'0');
for(int i=0,t=0;i<A.size()||t;++i){
if(i<A.size())t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0)C.pop_back();
string c;
for(int i=C.size()-1;i>=0;--i)c+=C[i]+'0';
return c;
}
string fun(int x){
string s="";
for(int i=0;i<x;++i)s+="00000000";
return s;
}
int str_int(string s){
int res=0;
for(int i=0;i<s.size();++i)res=res*10+s[i]-'0';
return res;
}
string mul_str(string a,string b){
string c="0";
vector<int>B;
if(b.size()%8!=0)B.push_back(str_int(b.substr(0,b.size()%8)));
for(int i=b.size()%8;i<b.size();i+=8){
B.push_back(str_int(b.substr(i,8)));
}
for(int i=B.size()-1,j=0;i>=0;--i,++j){
c=add_big(c,mul_big(a,B[i])+fun(j));
}
return c;
}
struct matrix{
public:
string a[2][2];
int n,m;
matrix (){
n=m=2;
for(int i=0;i<n;++i)for(int j=0;j<m;++j)a[i][j]="1";
a[1][1]="0";
}
void init(){
n=2,m=1;
a[0][0]="1";
a[1][0]="0";
}
void clear(){
for(int i=0;i<2;++i)for(int j=0;j<2;++j)a[i][j]="0";
}
void out(){
for(int i=0;i<2;++i){
for(int j=0;j<2;++j)cout<<a[i][j]<<endl;
}
}
friend matrix operator*(const matrix& A,const matrix& B){
matrix C;
C.clear();
int n=A.n,m=A.m,l=B.m;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
for(int k=0;k<l;++k)
C.a[i][j]=add_big(mul_str(A.a[i][k],B.a[k][j]),C.a[i][j]);
return C;
}
friend matrix operator^(matrix A,int b){
matrix ans;
ans.clear();
for(int i=0;i<2;++i)ans.a[i][i]="1";
while(b){
if(b&1)ans=ans*A;
A=A*A;
b>>=1;
}
return ans;
}
};
int main(){
int n;
scanf("%d",&n);
matrix A,B,C;
A=A^(n-1);
B.init();
C=A*B;
cout<<C.a[0][0]<<endl;
return 0;
}