計算交替調和級數的前 9 項和:f = 1 - 1/2 + 1/3 - 1/4 + ... + 1/9。此問題考察符號交替控制與浮點數運算。
#include <stdio.h>
#define N 9
void f(int m);
int main() {
f(N);
return 0;
}
void f(int m) {
int i;
int k = 1; // 符號控制變量:1 → -1 → 1 ...
double sum = 0.0; // 必須用浮點型
for (i = 1; i <= m; i++) {
sum += 1.0 / i * k; // 1.0 強制浮點除法
k = -k; // 符號翻轉:核心技巧
}
printf("1-1/2+1/3-1/4+...+1/9=%lf\n", sum); // 約 0.7456
}
| 方法 | 代碼片段 | 優缺點 |
|---|---|---|
| 符號變量翻轉(推薦) | k = -k; | 簡潔高效,無額外計算 |
| 條件判斷 | if (i%2==0) sum -= ...; else sum += ...; | 直觀但有分支開銷 |
| 數學函數 | pow(-1, i+1) | 函數調用開銷大,浮點誤差風險 |
1 / i 在 i>1 時結果為 0,必須寫成 1.0 / i 強制浮點除法。double (15-17 位有效數字) 優於 float (6-7 位),級數求和累積誤差時尤為重要。%lf 對應 double,%f 亦可(printf 統一處理)。此為萊布尼茨級數的部分和:1 - 1/3 + 1/5 - ... = π/4。但本題為調和級數變體 Σ(-1)^(n+1)/n,收斂至 ln(2) ≈ 0.6931。前 9 項和 0.7456 尚未充分收斂,需更多項逼近極限。
double alt_harmonic(int n) 返回前 n 項和。float/double/long double 精度差異。交替級數求和是「循環 + 狀態變量 + 浮點運算」的綜合訓練。掌握 k = -k 符號翻轉技巧、浮點除法強制轉換、精度類型選擇,為後續數值計算程序打下堅實基礎。