大佬,求助,c语言,不知道为什么输出结果只会是13

P1009 [NOIP1998 普及组] 阶乘之和

ace_12138 @ 2023-11-14 09:30:33


int s[100],p[100];
void inti(){
    for(int i=0;i<100;i++){
        s[i]=0;
        p[i]=0;
    }
    p[0]=1;
}
void show(){
    int i=99;
    for( ;i>=0;i--){
        if(s[i]>0) break;
    }
    for(int j=i ;j>=0;j--){
        printf("%d",s[j]); 
    }
}
void add (){
    int carry = 0; 
    for(int i=0;i<100;i++){
        carry += p[i]+s[i];
        s[i]=carry%10;
        carry=carry/10;
    }
}
void mul(int i){
    for (int j=0;j<100;j++){
        int carry = 0;
        carry += p[j]*i;
        p[j]=carry%10;
        carry=carry/10;                 
    }
}
int main(){
    inti();
    int n ;
    scanf("%d",&n);
    for(int k = 1;k<=n; k++){
        mul(k);
        add();
    }   
    show();
    return 0;
} ```
输入3————9
输入4————13
输入5————13
不知道为什么

by Xishuchen0912 @ 2023-11-18 15:25:42

#include<iostream>
#include<cstring>
using namespace std;
int n,a[90],b[90],c[90],f[90],d=0,len_a,len_b=1,len_c=1,len_ans,m=1;
string s;
int main(){
    cin>>n;
    b[0]=1; 
    for(int i=1;i<=n;i++){ 
        len_a=0;
        int p=i;
        while(p>0){ 
            a[len_a++]=p%10;
            p/=10;
        }
        for(int j=0;j<len_a;j++) 
            for(int k=0;k<=len_b;k++)
                c[j+k]+=a[j]*b[k];
        for(int j=0;j<len_c;j++) 
            if(c[j]>9) c[j+1]+=c[j]/10,c[j]%=10;
        if(c[len_c]) len_c++; 
        len_ans=len_b,len_b=len_c,m=max(m,len_c); 
        for(int k=len_c-1;k>=0;k--) b[k]=c[k]; 
        len_c=len_a+len_ans;
        memset(c,0,sizeof(c)); 
        for(int j=0;j<m;j++){ 
            f[j]+=b[j];
            if(f[j]>9) f[j+1]+=f[j]/10,f[j]%=10; 
        }
    }
    while(!f[m]&&m>0) m--; 
    for(int i=m;i>=0;i--) cout<<f[i]; 
    return 0; 
}

|