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啊喂,高精度基本操作