計算 S = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n!,直到 **最後一項 < 1e-6 (0.000001)** 停止。注意:1/0! 即首項 1 通常包含在內,但題目寫法「1+1/1!+1/2!+...」暗示從 1/1! 開始累加,首項 1 單獨列出。兩種理解結果相近(差 1),代碼中以「項值 < 1e-6 為終止條件」為準。
double a=1, b=0, c=1, e=0;
while (b >= 1e-6) { // ❌ b 初始為 0,條件不成立,循環零次執行
c = c * a; // 階乘分母
a = a + 1;
b = 1 / c; // 當前項值
e = e + b; // 累加和
}
printf("%f\n", e); // 輸出 0.000000
核心錯誤:b 初始化為 0,`while (b >= 1e-6)` **初次判斷即為假**,循環體**一次不執行**,e 保持 0。
#include <stdio.h>
int main() {
double term = 1.0; // 當前項值,從 1/0! = 1 開始
double sum = 1.0; // 累加和,含首項 1
int n = 1; // 分母階乘基數
double fact = 1.0; // 階乘值
do {
fact *= n; // n!
term = 1.0 / fact; // 1/n!
sum += term; // 累加
n++;
} while (term >= 1e-6); // 項值 >= 1e-6 繼續
printf("Sum = %.10f\n", sum); // 輸出 ~2.718281828 (e)
return 0;
}
#include <stdio.h>
int main() {
double sum = 1.0; // 首項 1
double fact = 1.0;
int n = 1;
double term;
while (1) {
fact *= n; // 計算 n!
term = 1.0 / fact; // 計算 1/n!
if (term < 1e-6) break; // 項值過小,終止
sum += term; // 累加
n++;
}
printf("Sum = %.10f\n", sum);
return 0;
}
| 問題 | 解決 |
|---|---|
| 循環零次執行 | 初始化項值滿足條件,或用 do-while |
| 階乘溢出 | 用 double 存儲 fact,17! 以上超過 long long 範圍,double 可表示至 170! |
| 浮點精度 | 1e-6 為雙精度常量,double 計算足夠;最終和趨近 e ≈ 2.718281828459045 |
| 題目「N 不小於 10 的 -6 次方」 | 即項值 < 10^-6 = 1e-6,與代碼一致 |
該級數為 e^x 在 x=1 的泰勒展開:e = Σ 1/n! (n=0..∞)。
程序輸出應接近 2.718281828。若只加到 1/9! (≈2.75e-6),和約 2.718279;加到 1/10! (≈2.75e-7) 則更精確。
初始化邊界變量使循環條件**首次判斷為真**,或用 do-while 結構。double 足夠勝任階乘與求和,無需 long double。核心邏輯:**先計算本項,判斷是否加入,再遞推下一項**。