紫书 习题 10-11 UVa 1646(斐波那契+高精度)

自己用手算一下可以发现是斐波那契数列,然后因为数字很大,用高精度

以后做题的时候记得算几个数据找规律 

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 11234;
const int MAXM = 2500;
struct node
{
	int len, d[MAXM];
	node() { len = 0; memset(d, 0, sizeof(d)); };
}f[MAXN];

node add(node a, node b)
{
	node c;
	c.len = max(a.len, b.len);
	REP(i, 0, c.len)
	{
		c.d[i] += a.d[i] + b.d[i];
		if(c.d[i] >= 10) c.d[i] -= 10, c.d[i+1]++;
	}
	
	if(c.d[c.len] > 0) c.len++;
	return c;
}

void init()
{
	f[3].d[0] = 4; f[3].len = 1;
	f[4].d[0] = 7; f[4].len = 1;
	REP(i, 5, MAXN) f[i] = add(f[i-1], f[i-2]);
}

void print(node c)
{
	for(int i = c.len - 1; i >= 0; i--)
		printf("%d", c.d[i]);
	puts("");
}

int main()
{
	init();
	int n;
	while(~scanf("%d", &n))
		print(f[n]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34416123/article/details/81169290