高精+递推,但是就是最后一个点出了问题

P1255 数楼梯

njuptxzy @ 2024-07-11 18:47:36

//使用高精度来进行求解
#include<iostream>
#include<cstring>
using namespace std;
struct big_num{
    int a[10005];//用来储存大数字 
    int len;//这个大数字的长度 
    big_num(int x=0){//默认值为0 
        memset(a,0,sizeof(a));//初始化这个数组 
        for(len=1;x;len++){
            a[len]=a[len]+x%10;
            x/=10;
        }
        len--;
    }
    int &operator[](int i){//重载了一下这个[]使得c[2]=c.a[2]; 
        return a[i];
    }
    void flatten(int L){
        len=L;
        for(int i=1;i<=len;i++){
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        for(;!a[len];) len--;
    }
    void print(){
        for(int i=len;i>=1;i--){
            cout<<a[i];
        }
    }
}; 
big_num operator +(big_num a,big_num b){
    big_num c;
    int len=max(a.len,b.len);
    for(int i=1;i<=len;i++)
    {
        c[i]+=a[i]+b[i];
    }
    c.flatten(len+1);
    return c;
}
int main(){
    int n;
    cin>>n;
    big_num a[n+1];//用来储存每一步数量的大小 
    a[1]=big_num(1);
    a[2]=big_num(2);
    for(int i=3;i<=n;i++)
    {
        a[i]=a[i-2]+a[i-1];
    }
    a[n].print() ;
    return 0;
}

感觉就是一个正常的高精度思路?但是过不了最后一个数据点……


by Lyw_and_Segment_Tree @ 2024-07-11 18:53:03

@njuptxzy 是什么错误,WA 还是 RE 还是别的。


by wfirstzhang @ 2024-07-11 18:56:44

你可以只用三个数。这样就不会 MLE。


by I_never_give_up @ 2024-07-11 19:13:14

你是照着深入浅出上写的吗?它的高精有问题,不信你试一下最大值,它会输出一长串前导0


by Lyw_and_Segment_Tree @ 2024-07-11 19:18:12

@2609_LJC 啊?


by njuptxzy @ 2024-07-11 19:27:47

@Lyw_Cyq_01 是MLE(内存爆了)


by njuptxzy @ 2024-07-11 19:29:18

@wfirstzhang 只用三个数字?你是指在main函数中不断更新三个数字,而不使用数组来解?我来试试(


by I_never_give_up @ 2024-07-11 19:35:30

@Lyw_Cyq_01 额,我照着书上写就是输出一长串前导0,哪知道ta的代码直接不输出了

I'm sorry


by njuptxzy @ 2024-07-11 22:11:55

@wfirstzhang 感谢大佬,过啦


|