杭电 1715 大斐波数

传送门: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;
} 

你可能感兴趣的:(题)