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

C 語言經典題解:遞歸平方根數列求和 (浮點數精度控制)

     編輯:關於C

題目:求數列之和

數列定義:首項為 n,後續各項為前一項的平方根。求前 m 項和,保留 2 位小數。
n < 10000, m < 1000,多組測資 (EOF 結束)。

數學模型

a₁ = n
a₂ = √a₁ = n^(1/2)
a₃ = √a₂ = n^(1/4)
...
aₖ = n^(1/2^(k-1))

Sₘ = Σ aₖ (k=1..m)

數列單調遞減趨近 1 (n>1 時) 或趨近 0 (n<1 時)。

完整解答

#include 
#include 

int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) == 2) {
        double sum = 0.0;
        double term = n;  // 當前項

        for (int i = 0; i < m; i++) {
            sum += term;
            term = sqrt(term);  // 下一項
        }

        printf("%.2f\n", sum);
    }
    return 0;
}

關鍵細節

細節處理
浮點型別用 double (雙精度) 而非 float,累加誤差更小,sqrt 回傳 double。
迴圈次數m 項:i=0..m-1 或 i=1..m,累加 m 次。
輸出格式%.2f 四捨五入保留 2 位小數。printf 自動處理四捨五入。
邊界情況n=0 → 全 0;n=1 → 全 1;m=1 → 和 = n。

測試案例

輸入輸出手算驗證
81 494.7381 + 9 + 3 + 1.732... = 94.732... → 94.73
2 23.412 + 1.414... = 3.414... → 3.41
1 55.001+1+1+1+1 = 5
0 30.000+0+0 = 0
10000 1000(較大值)極限測試,double 足夠

進階:收斂加速 (大 m 時)

當 m 很大 (如 10⁶),數列項趨近 1,可提前終止:

for (int i = 0; i < m; i++) {
    sum += term;
    double next = sqrt(term);
    if (fabs(next - term) < 1e-12) {  // 收斂到機器精度
        sum += (m - i - 1) * next;    // 剩餘項近似相等
        break;
    }
    term = next;
}

常見錯誤

  • 用 float 導致精度不足 (累加 1000 項誤差明顯)
  • sqrt 未包含 math.h、編譯未連結數學庫 -lm (GCC)
  • 迴圈次數寫錯 (如 i <= m 多加 1 項)
  • 輸出格式 %0.2f vs %.2f (前者寬度 0 無意義,後者標準)

總結

遞歸平方根數列求和 = 迴圈累加 + sqrt 迭代 + double 精度 + %.2f 輸出。核心技巧:項與和分離變數、雙精度防累加誤差、標準庫 sqrt、格式化輸出。此類「前一項衍生後一項」數列求和是數值計算基礎模板。

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