为什么第四个点错了两位数字

P1009 [NOIP1998 普及组] 阶乘之和

AnthonyZHOU @ 2022-10-31 16:02:03

#include <iostream>
#define SIZE 64
using namespace std;
struct EntierLong
{
    int chiffres[SIZE];
};
EntierLong addition(EntierLong n1,EntierLong n2)
{
    EntierLong n;
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i]=0;
    }
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i]+=(n1.chiffres[i]+n2.chiffres[i])%10;
        n.chiffres[i+1]+=(n1.chiffres[i]+n2.chiffres[i])/10;
    }
    return n;
}
EntierLong multiplication(EntierLong n1,EntierLong n2)
{
    EntierLong n;
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i]=0;
    }
    for(int i=0;i<SIZE;i++)
    {
        for(int j=0;j<SIZE;j++)
        {
            n.chiffres[i+j]+=(n1.chiffres[j]*n2.chiffres[i]);
        }
    }
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i+1]+=n.chiffres[i]/10;
        n.chiffres[i]%=10;
    }
    return n;
}
EntierLong rEntierLong(long long int num)
{
    EntierLong n;
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i]=0;
    }
    long long int k=num;
    int i=0;
    while(k!=0)
    {
        n.chiffres[i]=k%10;
        k/=10;
        i++;
    }
    return n;
}
EntierLong factoriel(int times)
{
    EntierLong n;
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i]=0;
    }
    n.chiffres[0]=1;
    for(int i=1;i<=times;i++)
    {
        EntierLong temps=rEntierLong(i);
        n=multiplication(n,temps);
    }
    return n;
}
void presentation(EntierLong n)
{
    int i=SIZE-1;
    while((n.chiffres[i]==0)&&(i>0))
    {
        i-=1;
    }
    for(int j=i;j>=0;j--)
    {
        cout<<n.chiffres[j];
    }
    cout<<endl;
}
int main()
{
    int times;
    cin>>times;
    EntierLong n;
    for(int i=0;i<SIZE;i++)
    {
        n.chiffres[i]=0;
    }
    for(int i=1;i<=times;i++)
    {
        n=addition(n,factoriel(i));
    }
    presentation(n);
    return 0;
}

|