某种序列(nyoj 114)

5 篇文章 0 订阅


某种序列

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述
数列A满足An = An-1 + An-2 + An-3, n >= 3 
编写程序,给定A0, A1 和 A2, 计算A99
输入
输入包含多行数据 
每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000) 
数据以EOF结束
输出
对于输入的每一行输出A99的值
样例输入
1 1 1
样例输出
69087442470169316923566147

大数问题,首先A99 = m*A0 + n*A1 + k*A2 然后我就先写了一个大数加把m,n,k求出来,然后再套公式就行了。
注意题目会有0 0 0的输入,所以要特别判断一下 虽然我这样写可能麻烦些,但是最后的代码时间用的比较少。。。。。

先是计算出m,n,k:
#include <stdio.h>
struct node
{
	int a[100], b[100], c[100];
};

node x[110];

void add(int n, int m)
{
	int i;
	if(n == 1)
	{
		x[m].a[0] = x[m - 1].a[0] + x[m - 2].a[0] + x[m - 3].a[0];
		for(i = 1; i < 100; i++)
		{
			x[m].a[i] = x[m - 1].a[i] + x[m - 2].a[i] + x[m - 3].a[i] + x[m].a[i - 1] / 10;
			x[m].a[i - 1] %= 10;
		}
	}
	if(n == 2)
	{
		x[m].b[0] = x[m - 1].b[0] + x[m - 2].b[0] + x[m - 3].b[0];
		for(i = 1; i < 100; i++)
		{
			x[m].b[i] = x[m - 1].b[i] + x[m - 2].b[i] + x[m - 3].b[i] + x[m].b[i - 1] / 10;
			x[m].b[i - 1] %= 10;
		}
	}
	if(n == 3)
	{
		x[m].c[0] = x[m - 1].c[0] + x[m - 2].c[0] + x[m - 3].c[0];
		for(i = 1; i < 100; i++)
		{
			x[m].c[i] = x[m - 1].c[i] + x[m - 2].c[i] + x[m - 3].c[i] + x[m].c[i - 1] / 10;
			x[m].c[i - 1] %= 10;
		}
	}
}

void print(int n[])
{
	int i;
	
	for(i = 99; i >= 0; i --)
	{
		if(n[i] != 0)
			break;
	}
	for(; i >= 0; i--)
		printf("%d", n[i]);
	printf("\n");
	/*
	for(i = 0; i < 27; i++)
		printf("%d, ", n[i]);
	printf("\n");
	*/
}

int main (void)
{     
	int i;
	x[3].a[0] = x[3].b[0] = x[3].c[0] = 1;
	x[4].a[0] = x[4].b[0] = 2;
	x[4].c[0] = 1;
	x[5].a[0] = 4;
	x[5].b[0] = 3;
	x[5].c[0] = 2;
	for(i = 6; i <= 99; i++)
	{
		add(1, i);
		add(2, i);
		add(3, i);
	}
	print(x[99].a);
	print(x[99].b);
	print(x[99].c);
	return 0;
}

套用公式:
#include <stdio.h>
#include <string.h>
int a[101] = {7, 1, 4, 4, 3, 9, 2, 1, 6, 7, 1, 7, 6, 1, 4, 8, 0, 7, 7, 8, 0, 2, 9, 9, 8, 2};
int b[101] = {1, 4, 2, 8, 8, 7, 1, 5, 4, 1, 3, 4, 1, 8, 6, 9, 1, 2, 5, 7, 6, 2, 3, 3, 4, 2};
int c[101] = {9, 8, 4, 3, 4, 8, 8, 5, 8, 7, 6, 1, 1, 7, 0, 2, 4, 5, 9, 7, 6, 2, 6, 7, 5, 1};

int x[101];
int y[101];
int z[101];

void change(int *n, int m)
{
	int i = 0;
	while(m)
	{
		n[i++] = m % 10;
		m /= 10;
	}
}

void mul(int *n, int *m)
{
	int temp[200];
	memset(temp, 0, sizeof(temp));
	int i, j;
	for(i = 0; i < 100; i++)
	{
		for(j = 0; j < 100; j++)
		{
			temp[i + j] += n[i] * m[j];
		}
	}
	for(i = 1; i < 100; i++)
	{
		temp[i] += temp[i - 1] / 10;
		temp[i - 1] %= 10;
		n[i - 1] = temp[i - 1];
	}
}

void add(int *n, int *m)
{
	n[0] += m[0];
	int i;
	for(i = 1; i < 100; i++)
	{
		n[i] = n[i] + m[i] + n[i - 1] / 10;
		n[i - 1] %= 10;
	}
}

void print(int n[])
{
	int i;
	for(i = 99; i >= 0; i --)
	{
		if(n[i] != 0)
			break;
	}
	for(; i >= 0; i--)
		printf("%d", n[i]);
	printf("\n");
}

int main (void)
{
	int xx, yy, zz;
	while(scanf("%d %d %d", &xx, &yy, &zz) != EOF)
	{
		if(xx == 0 && yy == 0 && zz == 0)
		{
			printf("0\n");
			continue;
		}
		memset(x, 0, sizeof(x));
		memset(y, 0, sizeof(y));
		memset(z, 0, sizeof(z));
		change(x, xx);//print1(x);
		change(y, yy);//print1(y);
		change(z, zz);//print1(z);
		
		mul(x, c);//print(x);
		mul(y, b);//print(y);
		mul(z, a);//print(z);
		add(x, y);//print(x);
		add(x, z);
		print(x);
	}
	return 0;
}







 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值