計算交替階乘級數:f = 1! - 2! + 3! - 4! + ... + 9!。此題綜合考察嵌套循環計算階乘、符號交替控制、整數溢出風險。
#include <stdio.h>
#define N 9
void f(int m);
int main() {
f(N);
return 0;
}
void f(int m) {
int i, j;
int k = 1; // 符號控制
int s = 1; // 階乘暫存
int sum = 0; // 總和
for (i = 1; i <= m; i++) {
// 內層循環計算 i!
s = 1; // 關鍵:每輪重置為 1
for (j = 1; j <= i; j++) {
s *= j;
}
sum += s * k; // 累加帶符號項
k = -k; // 符號翻轉
}
printf("1!-2!+3!-4!+...+9!=%d\n", sum); // 輸出: 326981
}
| 模式 | 代碼 | 時間複雜度 | 適用場景 |
|---|---|---|---|
| 遞推累積(推薦) | fact *= i; 在單層循環中 | O(n) | 連續計算 1!~n!,無重複運算 |
| 雙層循環重算 | 內層 for(j=1;j<=i;j++) s*=j; | O(n²) | 教學演示嵌套循環,或非連續項 |
優化版單層循環:
void f_optimized(int m) {
int i;
int k = 1;
int fact = 1;
int sum = 0;
for (i = 1; i <= m; i++) {
fact *= i; // 遞推:i! = (i-1)! * i
sum += fact * k;
k = -k;
}
printf("結果: %d\n", sum);
}
原代碼中 s = 1 放在外層循環開始處(或內層結束後),確保每次計算新階乘時從 1 開始乘。若誤放在外層循環外,s 會持續增大導致邏輯錯誤。
long long (64 位,可到 20!) 或大整數庫。手算前幾項:
注意:原代碼輸出 326981(正數),說明級數實為 1! - 2! + 3! - ... + 9! 共 9 項,最後一項為 +9!(奇數項正),結果應為 326981。手算最後一步符號錯誤,正確遞推:
i=1: sum=1 i=2: sum=1-2=-1 i=3: sum=-1+6=5 i=4: sum=5-24=-19 i=5: sum=-19+120=101 i=6: sum=101-720=-619 i=7: sum=-619+5040=4421 i=8: sum=4421-40320=-35899 i=9: sum=-35899+362880=326981 ✓
階乘交替級數是「嵌套循環、狀態維護、溢出意識」的優秀綜合練習。掌握遞推優化(O(n²)→O(n))體現算法優化思維;溢出分析養成工程嚴謹性。建議嘗試實現遞歸版階乘、長整型版本、及通用級數求和函數。