斐波那契-大数加法-数组解法
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2(n>=2,n∈N*),前几项为,(1,1,2,3,5,8,13。。。)
用longlong来递推在第93项就会溢出,因此采用数组解法求斐波那契的前n项
#include<bits/stdc++.h>
using namespace std;
#define MLEN 400//定义最大长度
int len( int a[][MLEN],int i ){//确定数据长度
int len=0;
while(a[i][++len]!=-1);
return len;
}
void add(int a[][MLEN],int i){
int tmp=0;//进位值
int len1=len(a,i-1);
int len2=len(a,i-2);
// printf("len1=%d len2=%d
",len1,len2);
a[i][len1]=-1;//注意是len1!!
for(int j=1;j<=len2;j++){
int t=a[i-1][len1-j]+a[i-2][len2-j];
a[i][len1-j]=(tmp+t)%10;
tmp=(tmp+t)/10;//进位值
}
if(len1>len2){
int t=a[i-1][0]+tmp;
if(t>=10){//len1进位
a[i][0]=t%10;
for(int j=len1+1;j>0;j--){//后移一位
a[i][j]=a[i][j-1];
}
a[i][0]=t/10;
}else{
a[i][0]=t;
}
}else if(len1==len2){
if(tmp>0){
for(int j=len1+1;j>0;j--){//后移一位
a[i][j]=a[i][j-1];
}
a[i][0]=tmp;
}
}
}
void print(int a[][MLEN],int i){//输出打印
int j=0;
while(a[i][j]!=-1){
cout<<a[i][j++];
}
}
int main()
{
int n;
scanf("%d",&n);
int a[n][MLEN]={
{1,-1},{1,-1},{2,-1},{3,-1},{5,-1},{8,-1},{1,3,-1},{2,1,-1}};//前8项
for(int i=8;i<n;i++){
add(a,i);
}
for(int i=0;i<n;i++){
printf("第%4d项= ",i+1);
print(a,i);
cout<<"
";
}
return 0;
}
