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
相关产品推荐
相关产品推荐

