POJ 3982 序列(高精度)

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;
}

你可能感兴趣的:(POJ 3982 序列(高精度))