首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C語言課程設計:求和級數 1 + 1/2 + 1/3 + ... + 1/n 的程式實現與邏輯解析

     編輯:程式設計疑難解答

題目理解與數學模型

這道經典的 C 語言課程設計題目要求計算調和級數的部分和:

S = 1 + 1/2 + 1/3 + ... + 1/n

但實際測試案例中,目標是找到使 |8 - S| 最小的項數 n。也就是說,我們要不斷累加級數,直到總和最接近 8 為止。

核心邏輯分析

觀察數值變化:

  • n=1 時,S=1,|8-S|=7
  • n=2 時,S=1.5,|8-S|=6.5
  • n=3 時,S≈1.833,|8-S|≈6.167

隨著 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. 整數除法陷阱:1/i 在 C 語言中會進行整數除法,結果恆為 0。必須寫成 1.0/i 或 (float)1/i。
  2. 浮點數精度:使用 float 可能存在精度問題,建議改用 double。
  3. 循環終止條件:利用「差值由減轉增」作為跳出依據,屬於典型的「找極值」邏輯。

優化版本建議

#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;
}

這個版本邏輯更清晰,輸出也更易讀,適合課程設計提交。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved