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

C 語言單循環計算交替級數 1 + 1/2 - 1/3 + 1/4 - 1/5 + ...

     編輯:程式設計綜合問答

題目要求

計算級數 S = 1 + 1/2 - 1/3 + 1/4 - 1/5 + 1/6 - ... ± 1/n,**只允許使用一個循環**。

核心邏輯

  • 首項為 1 (正)。
  • 後續項分母從 2 開始,符號交替:偶數分母為正,奇數分母為負 (或相反,視首項定義)。
  • 利用循環變量 `i` 判斷奇偶控制符號:
    sign = (i % 2 == 0) ? 1.0 : -1.0 (i 從 2 開始)。

標準實現 (for 循環)

#include <stdio.h>

double calc_series(int n) {
    double sum = 1.0;          // 首項 1
    for (int i = 2; i <= n; i++) {
        double term = 1.0 / i; // 當前項 1/i
        if (i % 2 == 0)        // 偶數分母:加
            sum += term;
        else                   // 奇數分母:減
            sum -= term;
    }
    return sum;
}

int main() {
    int n;
    printf("請輸入項數 n (n>=1): ");
    scanf("%d", &n);
    printf("前 %d 項和 = %.10f\n", n, calc_series(n));
    return 0;
}

無分支優化版 (利用符號變量)

double calc_series_opt(int n) {
    double sum = 1.0;
    double sign = 1.0; // i=2 時為正
    for (int i = 2; i <= n; i++) {
        sum += sign / i;
        sign = -sign; // 翻轉符號
    }
    return sum;
}

數學背景:萊布尼茨級數變體

標準萊布尼茨級數 π/4 = 1 - 1/3 + 1/5 - 1/7 + ... (奇數項交替)。
本題級數可改寫為:
S = 1 + Σ(k=1 to ∞) [1/(2k) - 1/(2k+1)]
收斂至 1 + (1 - ln 2) = 2 - ln 2 ≈ 1.30685。
驗證:calc_series(1000000) ≈ 1.306852819。

常見錯誤避坑

  1. 整數除法:`1 / i` 結果為 0,必須寫 `1.0 / i` 或 `(double)1 / i`。
  2. 符號邏輯反:仔細核對首項符號及奇偶對應,建議手算前 4 項驗證。
  3. 循環邊界:題目「只使用一個循環」不代表不能有首項初始化,`sum=1.0` 在循環外是合規的。
  4. 輸入合法性:`scanf` 返回值檢查,防止非數字輸入導致死循環。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved