計算交替階乘倒數級數: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);
}
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);
}
利用 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。
| n | 級數和 | 誤差 | 備註 |
|---|---|---|---|
| 5 | 0.63333... | ~1.2e-3 | |
| 10 | 0.632120535... | ~2.4e-8 | float 極限 |
| 15 | 0.6321205588285... | ~1e-15 | double 極限 |
交替級數誤差界:|誤差| ≤ 首個被省略項的絕對值。即誤差 ≤ 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;
}
交替階乘倒數級數融合了前幾題所有核心技術:
極限 1 - 1/e 在概率論中意義深遠:n 個元素的隨機排列中,至少有一個固定點的概率 → 1 - 1/e ≈ 63.2%(錯排問題極限)。這使本級數不僅是編程練習,更連接了離散數學與概率論核心結論。