本題為全國計算機等級考試二級C語言經典真題(2010.9、2012.3年份),考察級數求和、精度控制循環、浮點數運算等核心考點。題目要求根據給定公式計算π值,當項值小於給定精度eps時停止迭代。
根據以下公式求π的值(要求精度0.0005,即某項小於0.0005時停止迭代):
π = 2 × (1 + 1/3 + (1×2)/(3×5) + (1×2×3)/(3×5×7) + ...)
通項公式:第n項 = (n!) / ((2n+1)!!) = 第(n-1)項 × n/(2n+1)
#include <stdio.h>
#include <conio.h>
#include <math.h>
double fun(double eps) {
double s = 1.0, term = 1.0; // s: 累加和, term: 當前項
int n = 1;
while (term >= eps) { // 精度控制:項值 >= eps 繼續
term = term * n / (2 * n + 1); // 遞推公式
s = s + term;
n++;
}
return 2 * s; // 最終乘以2
}
void main() {
double x;
printf("Input eps: ");
scanf("%lf", &x);
printf("\neps = %lf, PI = %lf\n", x, fun(x));
}
s = 1.0(首項),term = 1.0(首項值),n = 1(項序號從1開始)term >= eps — 當前項值尚未小於要求精度,繼續疊代term = term * n / (2*n + 1)
s += termn++return 2 * s — 公式前導係數2輸入:0.0005
輸出:eps = 0.000500, PI = 3.141593

| 考點 | 關鍵技術 | 易錯點 |
|---|---|---|
| 級數求和 | 遞推公式替代階乘 | 直接算階乘導致溢出/效率低 |
| 精度控制 | while(term >= eps) | 條件寫反、用總和判斷而非當前項 |
| 浮點數運算 | double 類型、%lf 格式 | 用 float 精度不足、%f 匹配錯誤 |
| 循環邊界 | 首項已加,循環從第2項開始 | 少加首項或重複加首項 |
本題是二級C語言考試中「函數填空」類型的典型代表,核心考察:
while 循環實現精度控制double 類型與 %lf 的輸入輸出熟練掌握此類級數求和模式,對考試通關及工程數值計算基礎構建均有重要價值。