【题目描述】
用高精度计算出S=1!+2!+3!+…+n!(n≤50)S=1!+2!+3!+…+n!(n≤50),其中“!!”表示阶乘,例如:5!=5×4×3×2×15!=5×4×3×2×1。
输入正整数nn,输出计算结果SS。
【输入】
一个正整数nn。
【输出】
计算结果SS。
【输入样例】
5
【输出样例】
153
#include <iostream>
using namespace std;
int n;
const int maxn = 1e4 + 11;
int a[maxn],b[maxn];
int main(int argc, char const *argv[]){
cin >> n;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[0] = 1,b[0] = 1; //长度
a[1] = 1,b[1] = 1; //下标
if(n == 1 || n == 0){
cout << 1 << endl;
return 0;
}
for(int i = 2; i <= n; i++){
int temp = 0;
for(int j = 1; j <= a[0]; j++){
a[j] = a[j] * i + temp; //求n+1阶乘和
if(a[j] > 9){
temp = a[j]/10;
a[j] = a[j]%10;
if(j == a[0]) a[j+1] = temp;
}else temp = 0;
}
//处理末尾进位
int p = a[0]+1;
if(a[p] > 9){
a[p+1] += a[p]/10;
a[p] = a[p]%10;
p++;
}
if(a[p] > 0) a[0] = p;
else a[0] = p-1;
int temp2 = 0;
b[0] = a[0];
for(int k = 1; k <= a[0]; k++){
b[k] = b[k] + a[k] + temp2;
if(b[k] > 9){
temp2 = b[k]/10;
b[k] = b[k]%10;
if(k == a[0]) b[0]++;
}else temp2 = 0;
}
}
for(int y = b[0]; y >= 1; y--) cout << b[y];
cout << endl;
return 0;
}