斐波那契数列之第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;
}
- 使用字符数组进行数据存储,比起整型数组来说内存占用少。进行模拟除法,定义为整型数组并没有太大用处。
- 数组f0用于存储计算斐波那契数列的偶数项以及第0项;数组f1用于存储计算奇数项。
- if语句用于不断变换将被刷新的数组。计算偶数项时,要被刷新的是数组f0,奇数项时是f1。以达到用两个数组来重复进行加法。maxlen 和 minlen被随之更改,因为对于每一次要被刷新的数组(p1),它储存的值是前一项的值,p2储存的则是上一项的值,那么p1指向的数组的长度一定小于p2指向的数组。
- temp计算时要减掉48,把字符数字通过ASCII值 转化为十进制的数值。
- 最大要求到第9999项。我写的时候先定义了const int N=255。后来不断增大N的值调试结果不为乱码。N=5000时,9900也可以得到正确结果,再测试发现5001就可以了。我就强迫症地给加到5005了。
来源:CSDN
作者:Hoolys
链接:https://blog.csdn.net/weixin_43243846/article/details/103492109