計算 S = 1! + 2! + 3! + … + 20!。直接對每個 i 重新計算 i! 會導致大量重複乘法,時間複雜度 O(n²)。利用遞推關系 i! = (i-1)! × i 可降為 O(n)。
fact 變量存儲當前階乘值,初始 fact = 1 (即 0!)。i = 1..20:fact *= i 更新為 i!,隨即 sum += fact 累加。sum 即為所求。#include <stdio.h>
int main() {
long long fact = 1; // 使用 64 位整數擴大範圍
long long sum = 0;
int i;
for (i = 1; i <= 20; i++) {
fact *= i; // fact = i!
sum += fact; // 累加
printf("%2d! = %lld, 累加和 = %lld\n", i, fact, sum);
}
printf("\n最終結果: 1!+2!+...+20! = %lld\n", sum);
return 0;
}
1! = 1, 累加和 = 1
2! = 2, 累加和 = 3
3! = 6, 累加和 = 9
...
19! = 121645100408832000, 累加和 = 128425485935180314
20! = 2432902008176640000, 累加和 = 2561327494111820314
最終結果: 1!+2!+...+20! = 2561327494111820314
long long (64 位),否則會溢出得到負數或錯誤結果(原帖輸出 268040729 即為 32 位 long 溢出後的值)。%lld 對應 long long,%2d 對齊列寬,便於觀察。n > 20,64 位也會溢出,需引入大整數庫(如 GMP)或自定義高精度乘法。1^1 + 2^2 + … + n^n 等遞推型累加問題。計算階乘累加和的關鍵在於識別遞推關系並選擇足夠寬度的整數類型。本文提供的 O(n) 算法配合 long long,可在標準 C 環境下正確求得 20 以內的精確結果,是解決此類問題的標準範式。