50,但输出与答案一样

P1009 [NOIP1998 普及组] 阶乘之和

littlejohn @ 2024-03-26 15:33:04

#include<bits/stdc++.h>
using namespace std;
struct bignum{ 
    char s[20000]; 
    int num[20000]; 
    int len,flag; 
    bignum(){ 
        memset(num,0,sizeof(num)); 
        len=1; 
        flag=0; 
    }
    bignum(int x){
        for(len=1;x;len++){
            num[len]=x%10;
            x/=10;
        }
        len--;
    }
    int &operator[](int i){
        return num[i];
    }
    friend bool operator <(bignum a,bignum b){
        if(a.len != b.len){
            return a.len<b.len;
        }
        for(int i=a.len;i>=1;i--){
            if(a[i]<b[i])return true;
            if(a[i]>b[i])return false;
        }
        return false;
    }
    void input(){
        scanf("%s",s+1);
        len = strlen(s+1);
        for(int i=1;i<=len;i++)
            num[i] = s[len-i+1]-'0';
    }
    void print(){
        if(flag)cout<<'-';
        for(int i=len;i>=1;i--)cout<<num[i];
    }
};
bignum operator+(bignum a,bignum b){
    bignum ans;
    ans.len = max(a.len,b.len);
    for(int i=1;i<=ans.len;i++){
        ans[i] += a[i]+b[i];
        if(ans[i] >= 10){
            ans[i+1]++;
            ans[i]-=10;
        }
    }
    if(ans[ans.len + 1]){
        ans.len++;
    }
    return ans;
}
bignum operator-(bignum a,bignum b){
    bignum ans;
    if(a<b){
        ans.flag=1;
        swap(a,b);
    }
    ans.len = a.len;
    for(int i=1;i<=ans.len;i++){
        ans[i] += a[i]-b[i];
        if(ans[i] < 0){
            ans[i+1]--;
            ans[i]+=10;
        }
    }
    while(ans.len > 1 && ans[ans.len +1]==0)ans.len--;
    return ans;
}
bignum operator*(bignum a,bignum b){
    bignum ans;
    ans.len = a.len+b.len;
    for(int i=1;i<=a.len;i++){
        for(int j=1;j<=b.len;j++)
            ans[i+j-1] += a[i]*b[j];
    }
    for(int i=1;i<=ans.len;i++){
        if(ans[i]>=10){
            ans[i+1]+=ans[i]/10;
            ans[i]%=10;
        }
    }
    while(ans.len > 1 && ans[ans.len]==0)ans.len--;
    return ans;
}
bignum j(bignum a){
    bignum ans=1;
    for(bignum i=1;i<a+1;i=i+1){
        ans = ans*i;
    }
    return ans;
}
int main(){
    bignum a,ans;
    a.input();
    for(bignum i=1;i<a+1;i=i+1){
        ans = ans+j(i);
    }
    ans.print();
    cout<<endl;
    return 0;
}

输入:22


|