You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现1!+2!+…+50!大数阶乘求和的技术求助

解决1!+2!+…+50!的大数阶乘求和问题

嘿,我明白你现在的困扰——已经能搞定单个大数阶乘,但求和的时候用二维数组越搞越乱对吧?其实咱们换个思路,不用存下每一个阶乘结果,边算阶乘边累加就行,既省空间又好实现!

核心思路

  • 用一维数组存储大数:每个元素对应大数的一位数字(比如数组索引0存个位,索引1存十位,以此类推),这样进位计算会很方便。
  • 不用二维数组存所有阶乘:我们只需要维护两个一维数组——一个存当前计算出的阶乘(比如算到k时,存的是k!),另一个存累加的总和。
  • 循环迭代:从1到50,每算出一个阶乘就立刻加到总和里,然后基于当前阶乘计算下一个阶乘((k+1)! = k! * (k+1))。

完整代码实现

#include <iostream>
#include <algorithm> // 用于处理数组长度比较
using namespace std;

const int MAX_DIGITS = 10000; // 足够存50!的位数(50!实际只有65位,这里留足余量)

// 大数乘法:将num数组表示的数乘以x,结果存在num里,返回更新后的位数
int multiply(int num[], int digits, int x) {
    int carry = 0;
    for (int i = 0; i < digits; i++) {
        int product = num[i] * x + carry;
        num[i] = product % 10; // 保留当前位数字
        carry = product / 10;  // 计算进位值
    }
    // 处理剩余的进位(可能有多位)
    while (carry > 0) {
        num[digits] = carry % 10;
        carry /= 10;
        digits++;
    }
    return digits;
}

// 大数加法:将num数组加到sum数组里,返回sum更新后的位数
int add(int sum[], int sum_digits, int num[], int num_digits) {
    int carry = 0;
    int max_digits = max(sum_digits, num_digits);
    for (int i = 0; i < max_digits; i++) {
        // 位数不足的补0,避免数组越界
        int sum_bit = (i < sum_digits) ? sum[i] : 0;
        int num_bit = (i < num_digits) ? num[i] : 0;
        
        int total = sum_bit + num_bit + carry;
        sum[i] = total % 10;
        carry = total / 10;
    }
    // 处理加法后的剩余进位
    while (carry > 0) {
        sum[max_digits] = carry % 10;
        carry /= 10;
        max_digits++;
    }
    return max_digits;
}

int main() {
    int n = 50;
    int fact[MAX_DIGITS] = {0}; // 存当前阶乘,初始为1!
    int fact_digits = 1;
    fact[0] = 1;
    
    int sum[MAX_DIGITS] = {0}; // 存累加总和
    int sum_digits = 0;
    
    // 从1!开始循环累加
    for (int k = 1; k <= n; k++) {
        // 把当前阶乘加到总和里
        sum_digits = add(sum, sum_digits, fact, fact_digits);
        
        // 如果不是最后一个数,计算下一个阶乘
        if (k != n) {
            fact_digits = multiply(fact, fact_digits, k+1);
        }
    }
    
    // 输出结果:数组是从个位开始存储的,所以要倒序输出
    cout << "1!+2!+…+" << n << "! = ";
    for (int i = sum_digits - 1; i >= 0; i--) {
        cout << sum[i];
    }
    cout << endl;
    
    return 0;
}

代码细节解释

  • multiply函数:专门处理大数和整数的乘法,自动处理进位,返回更新后的大数位数。
  • add函数:负责两个大数的加法,同样处理进位,确保总和数组始终正确。
  • 主函数逻辑:先初始化1!,然后循环累加每个阶乘,同时计算下一个阶乘,最后倒序输出总和(因为数组是从个位开始存储的)。

为什么不用二维数组?

用二维数组存每个阶乘(比如a[k]存k!)会浪费大量空间(50个长度为9000的数组,大部分空间都是空的),而且累加的时候还要逐个数组遍历相加,逻辑更复杂。边算边加的方式只需要两个一维数组,空间开销小,代码逻辑也更清晰,非常适合新手理解和实现。

内容的提问来源于stack exchange,提问作者H.Zl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:00:21