/*用高精度计算出 S = 1! + 2! + 3! + ···+n!(n<=50)*/
#include <iostream>
using namespace std;
int a[101], s[101];
/*这里我们定义了两个int数组,a数组的作用是,计算某个数的阶乘,
然后把答案装在数组内,(一个单元里面只装一个数字),
然后s数组是用来装和的值,a数字只能用来装某一个数的阶乘,s只能用来
装和*/
/*Product函数用来计算某一个数的阶乘,将结果放在a数组中*/
void Product(int x){
int jw = 0;
for(int i=100; i>=0; i--){
a[i] = a[i]*x+jw;
/*假设从2开始,下面我们已经把末尾的值赋为了1,然后每次每一个数字的
阶乘就是这样的,比如说5!=5*4!,而4!我们已经计算出来,并且已经
保存在了a数组中,所以每次只需要用x去乘数组,就是普通的乘法原理,用
x乘以数字的末尾的哪一位,然后依次往前面乘*/
jw = a[i]/10;
a[i] %= 10;
}
}
/*sum函数是用来计算和的,Prouduct每计算了一个数的阶乘,通过sum函数,
把每个数的阶乘累加到s数组中*/
void sum(){
int jw = 0;
for(int i=100; i>=0; i--){
s[i] = s[i]+a[i]+jw;
jw = s[i]/10;
s[i] %= 10;
}
}
//输出函数
void Print(){
int start = 0;
/*因为我们的结果是倒着存的,先存在最后一位,然后是倒数第二位,依次向前
所以越靠前数组单元位置就可能为0,我们在输出的时候不需要把0输出,
所以这里我们定义了一个start值,用来标记第一个部位0的值*/
for(int i=0; i<=100; i++){
if(s[i]){
start = i;
break;
}
}
for(int i=start; i<=100; i++)
cout << s[i];
}
int main(){
int n;
cin >> n;
a[100] = s[100] = 1;
/*这里我们用了两个函数,一个是Product和sum函数*/
for(int i=1; i<=n; i++){
Product(i);
//每计算依次,就累加依次
sum();
}
Print();
return 0;
}