问题 C: 大斐波那契数
时间限制: 1 Sec 内存限制: 32 MB
提交: 47 解决: 9
题目描述
定义:
f(1)=1, f(2)=1, f(n>2)=f(n-1)+f(n-2)
我们把符合以上定义的序列称为斐波那契序列,现在给你一个数字n,请你求出f(n)。
输入
输入包含多组测试数据。每组数据为一个正整数n。
输出
输出对应的f(n)。题目保证结果不会超过1000位数字。
样例输入 Copy
100
样例输出 Copy
354224848179261915075
分析:
- 大数加法运算,可以用数组进行计算,每个元素存储一位数
- 测试样例必须通过最后一个一千位的样例:f(4786),否则会出现5 0%的错误结果
- 利用vector存放斐波那契数,利用stack进出栈进行逐位加法运算
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
#include <math.h>
using namespace std;
//vector:存放结果
//stack: 计算过程
int main(){
int n;
vector <string> haha;
char ai[1050],bi[1050];
stack <char> a,b,fin;
ai[0]='1';ai[1]='\0';bi[0]='1';bi[1]='\0';
haha.push_back(ai);
haha.push_back(bi);//存入一二两位
int ci, len=0;//ci为进位标志,len为实时记录每轮运算结果的长度,超过1000跳出循环
int i;
char ch,aa,bb;//ch记录每一位运算结果,aa,bb记录参与每位运算的数
while(len<=1000){
i=0;
len=0;
ci=0;
while(ai[i]!='\0'){
a.push(ai[i]);
i++;
}//入栈
i=0;
while(bi[i]!='\0'){
b.push(bi[i]);
i++;
}//入栈
while(!a.empty()&&!b.empty()){
aa=a.top();a.pop();
bb=b.top();b.pop();
ch=(char)('0'+(ci+(int)((aa-'0')+(bb-'0')))%10);
ci=(ci+(int)((aa-'0')+(bb-'0')))/10;
fin.push(ch);
len++;
}//逐位加法运算
if(a.empty()&&!b.empty()){
while(!b.empty()){
bb=b.top();
b.pop();
fin.push((char)('0'+(ci+(int)(bb-'0'))%10));
len++;
ci=(ci+(bb-'0'))/10;
}
}//由于两个数可能不等长,长的那一部分高位必须继续进行加法运算
if(ci>0){
fin.push((char)('0'+ci));
len++;
}//算到最后一位还有可能有进位
if(len>1000){
break;
}//超过一千位,结果超过限制,跳出循环
i=0;
while(bi[i]!='\0'){
ai[i]=bi[i];
i++;
}
ai[i]='\0';
i=0;
while(!fin.empty()){
bi[i]=fin.top();
fin.pop();
i++;
}
bi[i]='\0';
haha.push_back(bi);//计算结果压入数组
}
while(cin>>n){
if(n<=0){
break;
}
cout<<haha.at(n-1)<<endl;
}
haha.clear();
return 0;
}