题解
【基础】求1!+2!+3!+4!+...+n!
1 条题解
-
0
解题思路
题目要求计算 1! + 2! + 3! + …… + n!,n 最大 50。50! 有 65 位数字,int 和 long long 都存不下,要用高精度。
思路:
用一个数组 fac 存当前阶乘的值,另一个数组 sum 存累加和。
- fac 初始为 1(0!)
- 从 1 循环到 n:
- 每位乘 i,处理进位,得到 i! 存进 fac
- 把 fac 加到 sum,处理进位
- 最后 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