Description
数列A满足An=An-1+An-2+An-3, n>=3,编写程序,给定A0, A1 和 A2, 计算A99
Input
输入包含多行数据 ,每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 32767)
数据以EOF结束
Output
对于输入的每一行输出A99的值
Sample Input
1 1 1
Sample Output
69087442470169316923566147
Solution
显然直接加会爆,所以要模拟大数加法过程
Code
#include<iostream>
#include<cstring>
using namespace std;
int big,d[4][100],k,m,n,s;
int a[3];
void add()
{
int p=0;
for(int i=0;i<big;i++)
{
d[s][i]=d[k][i]+d[m][i]+d[n][i]+p;
if(d[s][i]>9)//进位
{
p=d[s][i]/10;
d[s][i]=d[s][i]%10;
}
else p=0;
}
if(p)//到最高位还需进位
{
d[s][big]=p;
big++;//位数加一
}
}
void f()
{
int l[5],p=0,j=-1;
for(int i=0;i<3;i++)//把A0,A1,A2转化为字符存储
{
j=-1;
while(a[i]!=0)
{
d[i][++j]=a[i]%10;
a[i]/=10;
}
}
for(int i=0;i<3;i++)
{
for(int j=0;j<5;j++)
{
if(d[i][j]!=0)
{
p=j;
continue;
}
}
if(big<p) big=p;//big为三个数的最高位
}
big++;
for(int i=0;i<97;i++)//用四个字符串表示An-3,An-2,An-1,An
{
k=i%4;//An-3
m=(i+1)%4;//An-2
n=(i+2)%4;//An-1
s=(i+3)%4;//An
add();
}
}
int main()
{
while(scanf("%d%d%d",&a[0],&a[1],&a[2])!=EOF)
{
big=0;
f();
for(int i=0;i<big;i++)//输出A99
cout<<d[s][big-i-1];
cout<<endl;//换行
for(int i=0;i<4;i++)//初始化
for(int j=0;j<100;j++)
d[i][j]=0;
}
return 0;
}