計算 S = 1! + 2! + ... + 10!。本文提供遞歸版階乘函數、迭代累加主函數,並分析整型溢出風險、長整型擴展、預計算表優化等工程實踐要點。
long long factorial_rec(int n) {
if (n <= 1) return 1;
return n * factorial_rec(n - 1);
}
long long factorial_iter(int n) {
long long result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
#include
long long factorial(int n) {
long long res = 1;
for (int i = 2; i <= n; i++) res *= i;
return res;
}
int main() {
long long sum = 0;
for (int i = 1; i <= 10; i++) {
long long f = factorial(i);
printf("%d! = %lld\n", i, f);
sum += f;
}
printf("1! + 2! + ... + 10! = %lld\n", sum);
return 0;
}
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
1! + 2! + ... + 10! = 4037913
| 問題 | 風險 | 解決 |
|---|---|---|
| `int` 存儲階乘 | 13! = 6227020800 > INT_MAX(2147483647) 溢出 | 用 `long long` (64位,至 20! 安全) |
| 遞歸深度過大 | n>10⁵ 棧溢出 | 生產環境用迭代 |
| 重複計算階乘 | O(n²) 乘法次數 | 迭代累加時同步更新 `fact *= i`,O(n) |
| 輸出格式 `%d` 對應 `long long` | 未定義行為 | 用 `%lld` (C99) 或 `%I64d` (MSVC) |
int main() {
long long fact = 1, sum = 0;
for (int i = 1; i <= 10; i++) {
fact *= i; // i! = (i-1)! * i
sum += fact; // 累加
printf("%d! = %lld\n", i, fact);
}
printf("Sum = %lld\n", sum);
return 0;
}
只用一次乘法、一次加法每輪,無函數調用開銷,編譯器極易優化。
1 到 10 階乘之和是「階乘函數 + 累加循環」的基礎組合練習。核心教訓:**選對數據類型(`long long`)、優選迭代遞歸、單循環融合計算避免重複**。此模板直接應用於「階乘尾部零 (LeetCode 172)」、「排列組合計數」、「概率期望計算」等組合數學編程問題。