斐波那契-大数加法-数组解法

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;
}
经验分享 程序员 微信小程序 职场和发展