nyoj-114-某种序列

某种序列

时间限制: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
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 50
char a[M],b[M],c[M],d[M];

void reset()
{
	memset(a,'0',M);
	memset(b,'0',M);
	memset(c,'0',M);
	memset(d,'0',M);
}

void StrRev(char *tmp)
{
	int len = strlen(tmp);
	int l = len / 2;
	char t;
	for(int i=0;i<l;i++)
	{
		t = tmp[i];
		tmp[i] = tmp[len-i-1];
		tmp[len-i-1] = t;
	}
	tmp[len] = '0';
}

void add()
{
	int n=0,sum;
	for(int i=3;i<100;i++)
	{
		for(int j=0;j<M;j++)
		{
			sum = (a[j]-'0') + (b[j]-'0')+ (c[j]-'0') + n;
			n = sum / 10;
			sum = sum % 10;
			d[j] = sum + '0';
		}
		strcpy(a,b);
		strcpy(b,c);
		strcpy(c,d);
	}
}

int main()
{
	int al,bl,cl,i;
	reset();
	while(scanf("%s%s%s",a,b,c)!=EOF)
	{
		/*strrev(a);
		strrev(b);
		strrev(c);
		al = strlen(a);
		bl = strlen(b);
		cl = strlen(c);
		a[al] = '0';
		b[bl] = '0';
		c[cl] = '0';*/
		StrRev(a);
		StrRev(b);
		StrRev(c);
		
		add();
		for(i=M-1;i>=0;i--)
			if(d[i] != '0')
				break;
		if(i < 0)
			printf("0\n");
		else
		{
			for(;i>=0;i--)
				printf("%c",d[i]);
			printf("\n");
		}
		

		reset();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u011514451/article/details/82111279
114