首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言練習:交替階乘倒數級數 1/1! - 1/2! + 1/3! - 1/4! + ... + 1/n! (逼近 1 - 1/e)

     編輯:關於C語言

問題描述

計算交替階乘倒數級數:f = 1/1! - 1/2! + 1/3! - 1/4! + ... + 1/n!。此級數交替收斂,極限為 1 - 1/e ≈ 0.6321205588...,結合了符號控制、浮點精度、級數收斂判斷多重考點。

基礎實現

#include <stdio.h>

void f(int m);

int main() {
    int n;
    printf("請輸入一個數(不能太大): ");
    scanf("%d", &n);
    f(n);
    return 0;
}

void f(int m) {
    int i, j;
    int s = 1;
    int k = 1;           // 符號控制:1, -1, 1, -1...
    double sum = 0.0;

    for (i = 1; i <= m; i++) {
        s = 1;
        for (j = 1; j <= i; j++) {
            s *= j;
        }
        sum += 1.0 / s * k;  // 關鍵:1.0 強制浮點除法
        k = -k;              // 符號翻轉
        s = 1;
    }
    printf("%lf\n", sum);
}

關鍵技術融合點

1. 雙重狀態維護:階乘遞推 + 符號翻轉


void f_optimized(int m) {
    double fact = 1.0, sum = 0.0;
    int sign = 1;
    for (int i = 1; i <= m; i++) {
        fact *= i;              // 階乘遞推
        sum += sign * (1.0 / fact);  // 累加帶符號倒數
        sign = -sign;           // 符號翻轉
    }
    printf("%.10f\n", sum);
}

2. 數學極限:1 - 1/e

利用 e 的級數展開:

e^x = Σ x^k / k!
e^{-1} = Σ (-1)^k / k! = 1 - 1/1! + 1/2! - 1/3! + 1/4! - ...
1 - e^{-1} = 1/1! - 1/2! + 1/3! - 1/4! + ...  即本級數

極限值 ≈ 0.6321205588285577。

3. 收斂速度與精度對比

n級數和誤差備註
50.63333...~1.2e-3
100.632120535...~2.4e-8float 極限
150.6321205588285...~1e-15double 極限

交替級數誤差界:|誤差| ≤ 首個被省略項的絕對值。即誤差 ≤ 1/(n+1)!,比單調級數收斂更快、更可控。

工程化版本:自適應精度 + 輸入驗證


#include <stdio.h>
#include <math.h>
#include <float.h>

double alt_factorial_reciprocal_sum(int n, double *error_bound) {
    double fact = 1.0, sum = 0.0;
    int sign = 1;
    for (int i = 1; i <= n; i++) {
        fact *= i;
        double term = 1.0 / fact;
        sum += sign * term;
        sign = -sign;
        if (term < sum * DBL_EPSILON) {  // 相對精度達標
            if (error_bound) *error_bound = term;  // 下一項即誤差界
            return sum;
        }
    }
    if (error_bound) *error_bound = 1.0 / (fact * (n+1));
    return sum;
}

int main() {
    int n;
    printf("請輸入 n (建議 1~20): ");
    if (scanf("%d", &n) != 1 || n < 1) {
        printf("無效輸入\n");
        return 1;
    }
    double err;
    double result = alt_factorial_reciprocal_sum(n, &err);
    printf("前 %d 項和: %.12f\n", n, result);
    printf("理論極限 1-1/e: %.12f\n", 1.0 - 1.0/M_E);
    printf("誤差界 (下一項): %e\n", err);
    return 0;
}

總結

交替階乘倒數級數融合了前幾題所有核心技術:

  • 遞推計算階乘 (O(n));
  • 符號翻轉變量 (k = -k);
  • 強制浮點除法 (1.0/fact);
  • 交替級數誤差界理論 (|R_n| ≤ a_{n+1});
  • 自適應停止條件 (機器 epsilon)。

極限 1 - 1/e 在概率論中意義深遠:n 個元素的隨機排列中,至少有一個固定點的概率 → 1 - 1/e ≈ 63.2%(錯排問題極限)。這使本級數不僅是編程練習,更連接了離散數學與概率論核心結論。

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