《阶乘之和》

用高精度计算出 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值