#include <iostream>
#include <cmath>
#define maxn 5010
using namespace std;
int len(int abc[maxn]) { // 查看数组长度,从 1 开始
int i=1;
for(i; abc[i+1]; i++);
return i;
}
void re0(int (&abc)[maxn]) { // 清零数组
for(int i=1; i<=maxn; i++)
abc[i]=0;
return;
}
void procheng(int (&a0)[maxn],int (&b0)[maxn],int (&c0)[maxn]) { // 高精度乘法
re0(c0);
for(int i=1; i<=len(a0); i++)
for(int j=1; j<=len(b0); j++)
c0[i+j-1]+=a0[i]*b0[j];
for(int i=1; i<=max(1,len(a0)+len(b0)); i++) {
c0[i+1]+=c0[i]/10;
c0[i]%=10;
}
return;
}
void projia(int (&a0)[maxn],int (&b0)[maxn],int (&c0)[maxn]) { // 高精度加法
re0(c0);
for(int i=1; i<=max(len(a0),len(b0)); i++) {
c0[i]+=a0[i]+b0[i];
c0[i+1]=c0[i]/10;
c0[i]%=10;
}
return;
}
void copy(int (&a0)[maxn],int (&b0)[maxn]) { // 复制数组
for(int i=1; i<=len(a0); i++)
b0[i]=a0[i];
return;
}
int main() {
int num[maxn]={0,1},evtime[maxn],tem[maxn],sum[maxn];
re0(sum);
int n;
cin>>n; // 阶乘数字
for(int i=1; i<=n; i++) {
evtime[1]=i%10;
evtime[2]=i/10;
procheng(num,evtime,tem);
copy(tem,num);
projia(num,sum,tem);
copy(tem,sum);
}
for(int i=len(sum); i>=1; i--)
cout<<sum[i];
return 0;
}
/*
num 每次阶乘结果
evtime 本次阶乘乘的数字
tem 暂存器
sum 所有阶乘结果
num*evtime>tem
tem>num
num+sum>tem
tem>sum
*/
附阶乘正确结果:
1 1
2 3
3 9
4 33
5 153
6 873
7 5913
8 46233
9 409113
10 4037913