斐波那契大数,开始一直wa,后来改成了longlong就过了,可能是只到50,所以开longlong就行,像hdu1865的大数,到了200,开longlong也过不了,只能手写大数运算
第一种,递归方法将结果存储在数组中,要用的时候直接调数组元素,优点:代码量小,简洁
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll Fib[55];
int main()
{
memset(Fib,0,sizeof(Fib));
Fib[0]=0,Fib[1]=1;
for(int i=2;i<=50;i++){
Fib[i]=Fib[i-1]+Fib[i-2];
}
ll n;
while(~scanf("%lld",&n)&&n!=-1){
printf("%lld\n",Fib[n]);
}
return 0;
}
第二种,利用矩阵乘法,在不取模的情况下,把数组开成longlong才能过,一般矩阵快速幂做斐波那契数列都是最优法,但是他比递归用起来更复杂,更难理解,优点是可以解决数据很大时的计算
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll a[2][2]={0};
ll b[2][2]={0};
ll ans[2][2];
void matrix(ll a[2][2],ll b[2][2],ll ans[2][2])
{
ll t[2][2];
memset(t,0,sizeof(t));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
t[i][j]=(t[i][j]+a[i][k]*b[k][j]);
}
}
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
ans[i][j]=t[i][j];
}
}
}
void ma_pow(ll n)
{
while(n){
if(n&1)matrix(a,b,b);
n>>=1;
matrix(a,a,a);
}
}
int main()
{
ll n;
while(~scanf("%lld",&n)&&n!=-1){
a[0][0]=a[0][1]=a[1][0]=1,a[1][1]=0;
b[0][0]=b[1][1]=1,b[0][1]=b[1][0]=0;
ma_pow(n);
printf("%lld\n",b[1][0]);
}
return 0;
}