top1编程
← 返回题目
题解

【基础】求1!+2!+3!+4!+...+n!

1 条题解

  • 0
    @ 2026-7-31 12:22:00

    解题思路

    题目要求计算 1! + 2! + 3! + …… + n!,n 最大 50。50! 有 65 位数字,int 和 long long 都存不下,要用高精度。

    思路:

    用一个数组 fac 存当前阶乘的值,另一个数组 sum 存累加和。

    1. fac 初始为 1(0!)
    2. 从 1 循环到 n:
      • 每位乘 i,处理进位,得到 i! 存进 fac
      • 把 fac 加到 sum,处理进位
    3. 最后 sum 里存的就是所有阶乘的和

    为什么要高精度? 因为 50! 太大,普通整数存不下,用数组一位一位存就能算任意大小的数。

    为什么一边算一边加? 不用先算完所有阶乘再相加,算出一个阶乘立刻加到总和里,省内存也简单。

    参考代码

    #include <iostream>
    using namespace std;
    
    int fac[100];  // 存当前阶乘
    int sum[100];  // 累加所有阶乘
    
    int main() {
        int n;
        cin >> n;
    
        fac[0] = 1;  // 0! = 1
    
        for (int i = 1; i <= n; i++) {
            // 每位乘 i,得到新的阶乘
            for (int j = 0; j < 100; j++) fac[j] *= i;
            // 处理进位
            for (int j = 0; j < 99; j++) {
                if (fac[j] >= 10) {
                    fac[j + 1] += fac[j] / 10;
                    fac[j] %= 10;
                }
            }
            // 累加到总和
            for (int j = 0; j < 100; j++) sum[j] += fac[j];
            // 总和进位
            for (int j = 0; j < 99; j++) {
                if (sum[j] >= 10) {
                    sum[j + 1] += sum[j] / 10;
                    sum[j] %= 10;
                }
            }
        }
    
        // 找到最高位并输出
        int p = 99;
        while (p > 0 && sum[p] == 0) p--;
        for (int i = p; i >= 0; i--) cout << sum[i];
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N²),n 次阶乘,每次处理若干位
    • 空间复杂度:O(N),存阶乘和总和的数组
    • 1