POJ 3982

直接用高精度加就能过了。但代码有些细节没有处理好,导致WA了很多次。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define max 600
char a[105][max];
char b[105][max];
char c[105][max];
void initnum()
{
    char ch[2]="0";
    // cout<<strlen(ch)<<endl;
    for(int i=0; i<100; i++)
    {
        strcpy(a[i],ch);
        strcpy(b[i],ch);
        strcpy(c[i],ch);
    }
    strcpy(a[0],"1");
    strcpy(b[1],"1");
    strcpy(c[2],"1");

}
char result[max];
void arrplus(char a[],char b[])///lena>lenb
{
    //  cout<<"plus:"<<a<<" "<<b<<" ";
    // cout<<strlen(a)<<" "<<strlen(b)<<endl;
    long long i,j,k,m,n,t;
    memset(result,'\0',max);
    if(strlen(a)>strlen(b))
    {
        // cout<<"haah"<<strlen(a)<<" "<<strlen(b)<<endl;
        for(i=0; i<strlen(b); i++)
            result[i]=b[strlen(b)-1-i];
        for(i=strlen(a); i>strlen(b); i--)
        {
            //cout<<"haha"<<endl;
            strcat(result,"0");
        }
        for(i=0; i<strlen(a); i++)
            b[i]=result[strlen(result)-1-i];
        //   cout<<"add:"<<a<<" "<<b<<" "<<result<<endl;
    }
    for(i=strlen(a)-1,k=0; i>=0; i--)
    {
        m=(a[i]-'0')+(b[i]-'0')+k;
        //  cout<<"m:"<<m<<" "<<endl;
        result[i]=(m%10)+'0';
        k=(int)m/10;
    }
    if(k!=0)
    {
        // cout<<"haha"<<endl;
        //   cout<<"k: "<<k<<" "<<result<<endl;
        char tmp[max]="\0";
        char ch=k+'0';
        tmp[0]=ch;
        strcat(tmp,result);
        strcpy(result,tmp);
    }
    // cout<<result<<endl;
}
int main()
{
    long long  i,j,k,m,n,t;
    while(cin>>i>>j>>k)
    {
        initnum();
        itoa(i,a[0],10);
        itoa(j,a[1],10);
        itoa(k,a[2],10);
        for(i=3; i<100; i++)
        {
            if(strlen(a[i-1])>strlen(a[i-2]))
                arrplus(a[i-1],a[i-2]);
            else
                arrplus(a[i-2],a[i-1]);
            char tmp[max]="\0";
            //   char tmp[max]="\0";
            strcpy(tmp,result);
            if(strlen(result)>strlen(a[i-3]))
                arrplus(tmp,a[i-3]);
            else
                arrplus(a[i-3],tmp);
            strcpy(a[i],result);
            //  cout<<a[3]<<endl;
          /*  if(strlen(b[i-1])>strlen(b[i-2]))
                arrplus(b[i-1],b[i-2]);
            else
            {
                //cout<<"haha"<<b[1]<<endl;
                arrplus(b[i-2],b[i-1]);
            }
            strcpy(tmp,result);
            if(strlen(result)>strlen(b[i-3]))
                arrplus(tmp,b[i-3]);
            else
                arrplus(b[i-3],tmp);
            strcpy(b[i],result);

            if(strlen(c[i-1])>strlen(c[i-2]))
                arrplus(c[i-1],c[i-2]);
            else
                arrplus(c[i-2],c[i-1]);
            strcpy(tmp,result);
            if(strlen(result)>strlen(c[i-3]))
                arrplus(tmp,c[i-3]);
            else
                arrplus(c[i-3],tmp);
            strcpy(c[i],result);
            cout<<"a:"<<a[i]<<" b:"<<b[i]<<" c:"<<c[i]<<endl;*/
        }
        cout<<a[99]<<endl;
    }
    /* t=98;
     if(strlen(a[t])>strlen(b[t]))
     arrplus(a[t],b[t]);
     else
         arrplus(b[t],a[t]);
         char tmp[max]="\0";
         strcpy(tmp,result);
     if(strlen(tmp)>strlen(c[t]))
         arrplus(tmp,c[t]);
     else
         arrplus(c[t],tmp);
     cout<<result<<endl;*/
    /*  while(cin>>i>>j>>k)
      {
          cout<<a[98][0]*i+a[98][1]*j+a[98][2]*k<<endl;
      }*/
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值