为什么这个代码前面总是输出几个零?怎么改?求助

P1009 [NOIP1998 普及组] 阶乘之和

FincheuwYggdrasil @ 2022-10-05 10:37:36

#include<bits/stdc++.h> 
using namespace std;
const int MAXN = 1e2+10;
const int size = 8;
const long long int MOD = 10;
int a[MAXN],b[MAXN],s[MAXN];
int n;
void write(int num[]);//输出高精度数
void clearto1(int num[]);//数组重置
void clearto0(int num[]);
void copy(int num1[],int num2[]);
void plusA(int a[],int b[]);//plus加法
void multiply(int a[],int b);
void write(int num[])
{
    printf("%d",num[num[0]]);
    for(int i = num[0];i >= 1;i--)
        printf("%d",num[i]); // ???
    puts("");
}
void clearto1(int num[])
{
    for(int i = num[0];i;i--)
        num[i] = 0;
    num[0] = num[1] = 1;
}
void clearto0(int num[])
{
    for(int i = num[0];i;i--)
        num[i] = 0;
    num[0] = 1;
}
void copy(int num1[],int num2[])
{
    for(int i = num1[0];i > num2[0];i--)
        num1[i] = 0;
    for(int i = 0;i <= num2[0];i++)
        num1[i] = num2[i];
}
void plusA(int a[],int b[])//need s->b
{
    clearto0(s);
    s[0] = max(a[0],b[0]) + 1;
    for(int i = 1;i <= s[0];i++)
    {
        s[i] += a[i] + b[i];
        s[i + 1] += s[i] / MOD;
        s[i] %= MOD;
    }
    if(!s[s[0]] && s[0] > 1)
        s[0]--;
}
void multiply(int a[],int b)
{
    clearto0(s);
    s[0] = a[0] + 2;
    for(int i = 1;i <= a[0];i++)
    {
        s[i] += a[i] * b;
        s[i + 1] += s[i] / MOD;
        s[i] %= MOD;
    }
    if(!s[s[0]] && s[0] > 1)
        s[0]--;
}
int main()
{
    scanf("%d",&n);
    if(!n)
    {
        printf("0");
    }
    clearto0(a);
    for(int i = 1;i <= n;i++)
    {
        clearto1(b);
        for(int j = 1;j <= i;j++)
        {
            multiply(b,j);
            copy(b,s);
        }
        plusA(a,b);
        copy(a,s);
    }
    write(a);
    return 0;
}

by MCRS_lizi @ 2022-10-05 11:15:06

输出之前除掉前缀0啊喂,高精度基本操作


|