C++自存错题(10)阶乘之和(高精度)

用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。

其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。

输入格式
一个正整数 n。

输出格式
一个正整数 S,表示计算结果。

输入输出样例
输入 #1复制

3
输出 #1复制

9
说明/提示
【数据范围】

对于 100% 的数据,1≤n≤50。

思路:计算大数阶乘累加和
#include <iostream>
#include <cstring> // 用于memset初始化数组
using namespace std;

// 移除不必要的全局变量,仅保留必要的数组和长度
int a[5001], b[5001];
int N;
int len_a = 1; // 单独记录a数组的长度,避免混用
int len_b = 1; // 单独记录b数组的长度

// 修正后的阶乘计算+累加函数
void JieC(int N) {
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    a[1] = 1; // 1!的初始值(低位在前,a[1]是个位,a[2]是十位...)
    
    for (int i = 1; i <= N; i++) {
        // 步骤1:计算i! → a数组 = a数组 * i(大数乘法)
        int carry = 0; // 进位变量
        for (int j = 1; j <= len_a; j++) {
            int temp = (int)a[j] * i + carry; // 用long long避免溢出
            a[j] = temp % 10; // 当前位保留个位
            carry = temp / 10; // 进位传递到下一位
        }
        // 处理乘法后的剩余进位(可能新增位数)
        while (carry > 0) {
            len_a++;
            a[len_a] = carry % 10;
            carry /= 10;
        }

        // 步骤2:将i!(a数组)累加到结果b数组(大数加法)
        carry = 0;
        int max_len = max(len_a, len_b);
        for (int j = 1; j <= max_len; j++) {
            long long temp = (long long)b[j] + a[j] + carry;
            b[j] = temp % 10;
            carry = temp / 10;
        }
        // 处理加法后的剩余进位
        while (carry > 0) {
            len_b++;
            b[len_b] = carry % 10;
            carry /= 10;
        }
    }
}

// 无需额外Qh函数,加法时已处理进位,此处仅统一len_b
void Qh() {
    len_b = 1;
    // 找到b数组的实际最大长度(避免前导0)
    for (int i = 5000; i >= 1; i--) {
        if (b[i] != 0) {
            len_b = i;
            break;
        }
    }
}

int main() {
    cin >> N;
    JieC(N);
    Qh();
    // 逆序输出(高位在前)
    for (int i = len_b; i >= 1; i--) {
        cout << b[i];
    }
    cout << endl;
    return 0;
}
#牛客AI配图神器#
全部评论

相关推荐

ddd7_:跟我一模一样,加微信的hr都同一个,扫码了白年书人查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务