數列定義:首項為 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 4 | 94.73 | 81 + 9 + 3 + 1.732... = 94.732... → 94.73 |
| 2 2 | 3.41 | 2 + 1.414... = 3.414... → 3.41 |
| 1 5 | 5.00 | 1+1+1+1+1 = 5 |
| 0 3 | 0.00 | 0+0+0 = 0 |
| 10000 1000 | (較大值) | 極限測試,double 足夠 |
當 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、格式化輸出。此類「前一項衍生後一項」數列求和是數值計算基礎模板。