斐波那契数列升级版—大数相加

别说谁变了你拦得住时间么 提交于 2019-12-12 12:40:39

斐波那契数列之第n项

求Fibonacci数列的第n项f[n]. f[0]=1; f[1]=1 ; f[n]=f[n-1]+f[n-2];

输入格式

输入一个不超过10000的正整数n。

输出格式

输出Fibonacci数列的第n项的值。

输入样例

99

输出样例

354224848179261915075

由于是最大到第9999项,显然不能用传统的整型数据类型去递归相加。
那就要定义数组对斐波那契数列的每一项进行模拟加法求和, 来得到结果。

先放上实现的代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int N=5005;
int main(){
    char f0[N]={'1'},	f1[N]={'1'};	 //初始化数组,第一个元素为字符1,其他为空字符 
    char *p1,*p2;
    int n,temp,c,j,x=0,maxlen,minlen,i;
    cin>>n;	//第n项 
	for(i=1;i<n;i++){	//求第n项的循环。如:求第2项只需要执行一次 
		c=0;	j=0;	//c作为进位的数值	j为遍历数组的索引值 
		 
		 //见如下说明的 3.
		if(i%2){
    		p1=f0;	p2=f1;
			minlen=strlen(f0);
			maxlen=strlen(f1);		
		}
		else{
			p1=f1;	p2=f0;
			minlen=strlen(f1);
			maxlen=strlen(f0);
		}
		
		//进行模拟加法
		for(j=0;j<minlen;j++){
			temp=p1[j]-48+p2[j]-48+c;	//48为ASCII值的阿拉伯数字 0
			p1[j]=temp%10+48;
			c=temp/10;
			--maxlen;
		}
		p1[j]=c+48;
	} 

	while(*p1!=0){	//计算数组元素数直到为空字符
		++p1;
		x++;
	}
	//把p1还原到数组的首地址
	if(n%2)		p1=f1;
	else	p1=f0;

	i=x-1;
	while(p1[i]=='0'){	//排除前导 0
		i--;
	}
	for(;i>=0;i--){		//从第一个不为 0字符的数组元素开始倒序输出
		cout<<p1[i];
	}
	return 0;
}



  1. 使用字符数组进行数据存储,比起整型数组来说内存占用少。进行模拟除法,定义为整型数组并没有太大用处。
  2. 数组f0用于存储计算斐波那契数列的偶数项以及第0项;数组f1用于存储计算奇数项
  3. if语句用于不断变换将被刷新的数组。计算偶数项时,要被刷新的是数组f0,奇数项时是f1。以达到用两个数组来重复进行加法。maxlen 和 minlen被随之更改,因为对于每一次要被刷新的数组(p1),它储存的值是前一项的值,p2储存的则是上一项的值,那么p1指向的数组的长度一定小于p2指向的数组。
  4. temp计算时要减掉48,把字符数字通过ASCII值 转化为十进制的数值。
  5. 最大要求到第9999项。我写的时候先定义了const int N=255。后来不断增大N的值调试结果不为乱码。N=5000时,9900也可以得到正确结果,再测试发现5001就可以了。我就强迫症地给加到5005了。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!