0分求助

P1009 [NOIP1998 普及组] 阶乘之和

chenkuo @ 2022-06-30 14:46:03

大佬们,我的代码再一次出bug了,可以帮我看看吗,谢谢

#include<bits/stdc++.h>
using namespace std;
int n,a[10000][10000],s[10000],c[10000],q;
int main(){
    cin>>n;
    a[1][1]=1;
    s[1]=1;
    c[1]=1;
    q=1;
    for(int i=2;i<=n;i++){
        c[i]=c[i-1];
        for(int j=1;j<=c[i];j++){
            a[i][j]=a[i-1][j]*i;
        }
        for(int j=1;j<c[i];j++){
            if(a[i][j]>9) a[i][j+1]=a[i][j]/10,a[i][j]%=10;
        }
        if(a[i][c[i]]>9) a[i][c[i]]-=10,a[i][++c[i]]=1;
        for(int j=1;j<=q;j++){
            s[j]+=a[i][j];
        }
        for(int j=1;j<q;j++){
            if(s[j]>=10) s[j+1]++,s[j]-=10;
        }
        if(s[q]>=10) s[q]-=10,s[++q]=1;
    }
    for(int i=q;i>=1;i--){
        cout<<s[i];
    }
}

可以的话帮我看看这个


by Happy_Orca @ 2022-06-30 15:04:51

把S数组去掉,再把第三个循环里

a[i][j+1]=a[i][j]/10

改成

a[i][j+1]+=a[i][j]

if(a[i][c[i]]>9) a[i][c[i]]-=10,a[i][++c[i]]=1;

改成

if(a[i][c[i]]>9) a[i][++c[i]]+=a[i][c[i]]/10,a[i][c[i]]%=10;

最后直接输出a[n]


by Happy_Orca @ 2022-06-30 15:06:52

c数组也不要了,直接一个q跟全场


by Happy_Orca @ 2022-06-30 15:07:09

@chenkuochenkuo


by chenkuo @ 2022-06-30 15:07:34

@fo_ol 大佬可以解释一下吗


by chenkuo @ 2022-06-30 15:09:05

@fo_ol 我原来为什么错


by chenkuo @ 2022-06-30 15:09:22

谢谢


by Happy_Orca @ 2022-06-30 15:10:12

@chenkuochenkuo 这题不需要这么麻烦。因为 n<=50 所以,完全可以用一个一维数组去乘i,按照乘法规律每次维护一下就行了


by chenkuo @ 2022-06-30 15:11:36

@fo_ol 好的谢谢


by Happy_Orca @ 2022-06-30 15:13:23

@chenkuochenkuo 因为你 a[i] 是继承了上一次的运算结果,然后你用s数组去加 a[i] ,结果肯定是错的,而且你a[i]维护的也不是正确的数值


|