計算 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項絕對值 ≤ eps。輸入 4E-2 輸出 0.854457,輸入 0.02 輸出 0.826310。
do {
k = i / j;
i = -i;
j += 3;
s += k; // 先加再判斷
} while (fabs(k) >= eps);
問題:先將當前項加入總和,再判斷是否滿足精度。當 |k| < eps 時,該項已被加入,導致結果偏大。
#include <stdio.h>
#include <math.h>
int main() {
double eps;
scanf("%lf", &eps);
double sum = 0.0;
double term = 1.0; // 第一項 1/1
double denom = 1.0; // 分母
int sign = 1; // 正負號
while (fabs(term) >= eps) {
sum += term; // 累加符合精度的項
denom += 3.0; // 分母 +3
sign = -sign; // 翻轉符號
term = sign / denom; // 計算下一項
}
printf("sum = %.6lf\n", sum);
return 0;
}
| 輸入 eps | 輸出 sum | 說明 |
|---|---|---|
| 4E-2 (0.04) | 0.854457 | 符合樣例 |
| 0.02 | 0.826310 | 符合樣例 |
do-while 至少執行一次,但題目要求「直到最後一項絕對值不大於 eps」,第一項 1.0 通常大於 eps,故 while 更直觀。double 足夠精確,題目保證不溢位。%.6lf 保留六位小數。