【题目描述】
用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。。
【输入】
一个正整数n。
【输出】
计算结果S。
【输入样例】
5
【输出样例】
153
【参考程序】
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n;
int len = 1; // len存储阶乘的 长度
int sumlen = 1; // sumlen存储 阶乘和的长度
int t[40001]; // 数组t存储 阶乘
int sum[40001]; // 数组sum存 阶乘和
void fac(int x) { // 计算x的阶乘(factorial)
for (int i=1; i<=len; i++) {
t[i] *= x; // 每个位数乘以x
}
int i = 1;
while (t[i]>9 || i<len) { // 判断是否需要进位
t[i+1] += t[i] / 10; // 进位
t[i] %= 10; // 只保留个位
i++; // 继续对下一位进行处理
}
len = i;
}
void add() {
for (int i=1; i<=len; i++) {
sum[i] += t[i]; // 对每一位都相加
if (sum[i] > 9) {
sum[i+1] += sum[i] / 10; // 进位
sum[i] %= 10; // 只保留个位
sumlen = max(sumlen, i+1);
}
sumlen = max(sumlen, i); // 判断当前数的位置,避免了多余的计算
}
}
int main() {
cin >> n;
t[len] = 1;
for (int i=1; i<=n; i++) { // 计算阶乘和
fac(i); // 计算i的阶乘
add(); // 计算1..n阶乘和
}
for (int i=sumlen; i>=1; i--) {
cout << sum[i];
}
return 0;
}