蜜汁问题

P1255 数楼梯

Xecades @ 2019-08-08 10:38:27

我用结构体来存储计算,重载加法运算符,结构体高精加法代码是从以前A了的题里面copy来的,应该没错,但是这道题就爆炸了,就是不管怎么算,得出的数字都只有一位数,我先是认为是没重载等号,重载了还是不行,但如果我这样用:

calc a=(string)"5888546645634754",b=(string)"534357657584324564347585434";
calc c=a+b;
c.out();

没毛病,这是递归的锅吗?

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=5010;

int n;

struct calc
{
    ll len;
    ll s[maxn];
    calc()  {len=0;memset(s,0,sizeof s);}
    calc(string str)//将string类型转为calc类型
    {
        len=str.length();
        for(ll i=0;i<len;i++)
            s[i+1]=str[i]-'0';
    }
    calc(ll* str,ll l)
    {
        len=l;
        for(ll i=0;i<=len;i++)
            s[i+1]=str[i];
    }
    calc operator+(calc k)//高精加法多半没错
    {
        calc ans;
        memset(ans.s,0,sizeof(ans.s));

        ll ks[maxn]={0},ts[maxn]={0},tmp[maxn]={0};
        ll length=max(len,k.len)+1;

        for(ll i=1;i<=k.len;i++)
            ks[i]=k.s[k.len-i+1];
        for(ll i=1;i<=len;i++)
            ts[i]=s[len-i+1];

        for(ll i=1;i<=length;i++)
        {
            tmp[i]+=ks[i]+ts[i];
            tmp[i+1]=tmp[i]/10;
            tmp[i]%=10;
        }

        ll left=length;
        while(tmp[left]=='0')
            left--,length--;
        left--;

        for(;left>0;left--)
            ans.s[length-left]=tmp[left];

        ans.len=length-1;
        return ans;
    }
    void out()//输出
    {
        for(ll i=1;i<=len;i++)
            cout<<s[i];
    }
};

calc fib[maxn];//就算我不用数组,还是不行

int main()
{
    cin>>n;
    fib[1]=(string)"1";//fib[1]值为1,长度为1
    for(int i=2;i<=n+1;i++)
        fib[i]=fib[i-1]+fib[i-2];//爆炸现场

    fib[n+1].out();
    return 0;
}

by t162 @ 2020-01-11 11:40:35

@Xecades 您的len從來都沒更新過


by Xecades @ 2020-01-15 21:58:10

@Bambusoideae 噢!谢谢你(虽然重写已经A了


|