传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1715
大斐波数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25234 Accepted Submission(s): 9041
Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
Input
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
Output
输出为N行,每行为对应的f(Pi)。
Sample Input
5
1
2
3
4
5
Sample Output
1
1
2
3
5
分析
就是简单的求解斐波那契数列,不过需要用到大数运算。我们可以写一个带有返回值的函数用来求解大数运算,返回值就是存储大数的字符串,然后不断地循环,直至求出结果。
需要注意的就是本题需要打表,否则会时间超限。
参考答案
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
string bigaad(string s,string c)//大数加法
{
int i,j,a,b;
int p[1000],q[1000];
string str,t;
a=s.size();
b=c.size();
memset(p,0,sizeof(p)); //清除数组中的数值,使之为0;
memset(q,0,sizeof(q)); //清除数组中的数值,使之为0;
for(i=0,j=a-1;i<a;i++,j--)
{
p[i]=s[j]-'0';
}
for(i=0,j=b-1;i<b;i++,j--)
{
q[i]=c[j]-'0';
}
n=a>b?a:b;
for(i=0;i<n;i++)
{
p[i]=p[i]+q[i];
if(p[i]>9)
{
if(i==n-1)
n++; //保证进位(位次的增加)
p[i]=p[i]-10;
p[i+1]+=1;
}
}
for(i=n-1,j=0;i>=0;i--,j++) //倒序输出
{
t=p[i]+'0';
str.append(t); //从尾部插入元素
}
return str;
}
int main()
{
string str_1,str_2,str;
int N,i,k;
vector<string> v;
v.push_back("1");
v.push_back("1");
scanf("%d",&N);
while(N--)
{
scanf("%d",&k);
if(k<=v.size())
{
cout<<v[k-1]<<endl;
continue;
}
k=k-v.size();
while(k--)
{
str=bigaad(v[v.size()-1],v[v.size()-2]);
v.push_back(str); //向量v用来存储表
str_1=str_2;
str_2=str;
}
for(i=0;i<n;i++)
printf("%c",str[i]);
printf("\n");
}
return 0;
}