大数问题;
描述
数列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
来源
水题比赛中较不水的
上传者
hzyqazasdf
代码:
#include <iostream>
#include <cstring>
#include <iomanip>
#include <string>
#include <cmath>
#include <stdio.h>
using namespace std;
int A_1[100],A_2[100],A_3[100];
char ch[105][100];
void get(int x)
{
memset(A_1,0,sizeof(A_1));
memset(A_2,0,sizeof(A_2));
memset(A_3,0,sizeof(A_3));
int i,j,k;
k=strlen(ch[x-1]);
for(i=0;i<k;i++)
A_1[i]=ch[x-1][k-i-1]-'0';
k=strlen(ch[x-2]);
for(i=0;i<k;i++)
A_2[i]=ch[x-2][k-i-1]-'0';
k=strlen(ch[x-3]);
for(i=0;i<k;i++)
A_3[i]=ch[x-3][k-i-1]-'0';
}
void sum()
{
int i,j,k,p,q;
for(i=3;i<=99;i++)
{
k=strlen(ch[i-1]);
if(k<strlen(ch[i-2]))k=strlen(ch[i-2]);
if(k<strlen(ch[i-3]))k=strlen(ch[i-3]);
p=0;//进位
get(i);
for(j=0;j<k;j++)
{
A_1[j]+=A_2[j]+A_3[j]+p;
p=A_1[j]/10;
if(A_1[k-1]>9)k++;
A_1[j]=A_1[j]%10;
}
for(j=50;j>=0;j--)
if(A_1[j]!=0) break;//去掉前导零
for(p=0;p<=j;p++)
ch[i][j-p]=A_1[p]+'0';
}
cout<<ch[99]<<endl;
memset(ch,0,sizeof(ch));
}
int main()
{
while(scanf("%s%s%s",&ch[0],&ch[1],&ch[2])!=EOF)
{
if(ch[0][0]=='0'&&ch[1][0]=='0'&&ch[2][0]=='0') cout<<"0"<<endl;//一定要注意这里;
else
sum();
}
return 0;
}