這道經典的 C 語言課程設計題目要求計算調和級數的部分和:
S = 1 + 1/2 + 1/3 + ... + 1/n
但實際測試案例中,目標是找到使 |8 - S| 最小的項數 n。也就是說,我們要不斷累加級數,直到總和最接近 8 為止。
觀察數值變化:
隨著 n 增加,S 單調遞增,|8-S| 先減小後增大。當絕對值開始變大時,說明剛剛越過了最接近 8 的點,此時前一項即為答案。
float flag, temp = 8, s = 1;
for (int i = 1; ; i++) {
s += 1.0 / i; // 注意:必須用 1.0 避免整數除法
if (8 - s < 0) {
flag = -(8 - s);
} else {
flag = 8 - s;
}
if (flag < temp) {
temp = flag;
continue;
}
printf("%f, %d", s, i);
break;
}
1/i 在 C 語言中會進行整數除法,結果恆為 0。必須寫成 1.0/i 或 (float)1/i。float 可能存在精度問題,建議改用 double。#include <stdio.h>
#include <math.h>
int main() {
double sum = 0.0;
double target = 8.0;
double minDiff = target;
int bestN = 0;
for (int n = 1; ; n++) {
sum += 1.0 / n;
double diff = fabs(target - sum);
if (diff < minDiff) {
minDiff = diff;
bestN = n;
} else {
// 差值開始變大,說明已經越過最佳點
printf("最接近 8 的部分和:S = %.10f\n", sum - 1.0/n);
printf("對應的項數 n = %d\n", bestN);
break;
}
}
return 0;
}
這個版本邏輯更清晰,輸出也更易讀,適合課程設計提交。