【hdoj_1865】1sting(递推+大数)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1865


本题的关键是找递推关系式,由题目,可知前几个序列的结果,序列长度为n=1,2,3,4,5的结果分别是,f(1)=1,f(2)=2,f(3)=3,f(4)=5,f(5)=8,所以猜测,递推关系式为:

f(n)=f(n-1)+f(n-2),n>=3,f(1)=1,f(2)=2;


序列长度不超过200,即n的值不超过200,则估计f(n)的值得位数不超过1000位.在代码中,我们采用10000进制的方法,将数字f(...)的结果记录在数组中,每个数组元素可以存8位数.


与本题同类型的题目:http://blog.csdn.net/ten_sory/article/details/60883746


C++代码如下:

#include<iostream>
#include<string>
#include<string.h>
using namespace std;

#define maxn 200 + 1
#define len 100
int a[maxn][len];

int main()
{
	int i,j;
	for(i=1;i<maxn;i++)
		memset(a[i],0,sizeof(a[i]));
	a[1][len-1] = 1;
	a[2][len-1] = 2;//都是len-1

	for(i=3;i<maxn;i++)
	{
		int c = 0;
		for(j=len-1;j>=0;j--)
		{
			c += (a[i-1][j]+a[i-2][j]);
			a[i][j] = c % 100000000;
			c /= 100000000;
		}
	}

	string s;
	int T;
	scanf("%d",&T);
	while(T--)
	{
		cin >> s;
		int n = s.length();
		if(n==1)
			printf("%d\n",1);
		else if(n==2)
			printf("%d\n",2);
		else
		{
			for(i=0;i<len;i++)
				if(a[n][i])
					break;
			printf("%d",a[n][i]);
			for(j=i+1;j<len;j++)
				printf("%08d",a[n][j]);
			printf("\n");
		}
	}

	return 0;
}
上述代码,提交可以通过.

posted @ 2017-03-09 15:22  tensory  阅读(336)  评论(0编辑  收藏  举报