用高精度计算出 S=1!+2!+3!+⋯+n!S=1!+2!+3!+⋯+n!(n≤50n≤50)。
其中 !
表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=1205!=5×4×3×2×1=120。
输入格式
一个正整数 nn。
输出格式
一个正整数 SS,表示计算结果。
输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于 100%100% 的数据,1≤n≤501≤n≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n≤20n≤20,使用书中的代码无法通过本题。
C语言代码实现:
#include <stdio.h>
#include <stdlib.h>
// 结构体用于表示大整数,以数组形式存储每一位数字
typedef struct {
int *digits;
int size;
} BigInt;
// 函数用于初始化大整数结构体
BigInt initBigInt() {
BigInt num;
num.digits = (int *)malloc(sizeof(int));
num.digits[0] = 0;
num.size = 1;
return num;
}
// 函数用于释放大整数结构体占用的内存
void freeBigInt(BigInt num) {
free(num.digits);
}
// 函数用于两个大整数相乘,结果保存在a中
void multiply(BigInt *a, int b) {
int carry = 0,i,j;
for (i = 0; i < a->size; i++) {
int sum = a->digits[i] * b + carry;
a->digits[i] = sum % 10;
carry = sum / 10;
}
while (carry > 0) {
a->digits = (int *)realloc(a->digits, (a->size + 1) * sizeof(int));
a->digits[a->size] = carry % 10;
carry /= 10;
a->size++;
}
}
// 函数用于两个大整数相加,结果保存在a中
void add(BigInt *a, BigInt b) {
int i;
if (b.size > a->size) {
a->digits = (int *)realloc(a->digits, b.size * sizeof(int));
for (i = a->size; i < b.size; i++) {
a->digits[i] = 0;
}
a->size = b.size;
}
int carry = 0;
for (i = 0; i < a->size; i++) {
int sum = a->digits[i] + (i < b.size? b.digits[i] : 0) + carry;
a->digits[i] = sum % 10;
carry = sum / 10;
}
if (carry > 0) {
a->digits = (int *)realloc(a->digits, (a->size + 1) * sizeof(int));
a->digits[a->size] = carry;
a->size++;
}
}
int main() {
int n;
scanf("%d", &n);
BigInt total_sum = initBigInt();
int i,j;
for (i = 1; i <= n; i++) {
BigInt factorial = initBigInt();
factorial.digits[0] = 1;
for (j = 1; j <= i; j++) {
multiply(&factorial, j);
}
add(&total_sum, factorial);
freeBigInt(factorial);
}
// 输出结果,从高位到低位输出大整数的每一位数字
for (i = total_sum.size - 1; i >= 0; i--) {
printf("%d", total_sum.digits[i]);
}
printf("\n");
freeBigInt(total_sum);
return 0;
}