皮球從高度 H 自由落下,觸地後反彈至原高度一半,再落下,循環往複。求第 n 次落地時總經過距離、第 n 次反彈高度。輸入:H n(長整型);輸出:距離、高度,保留一位小數。
Hi (i>1) 次落地:新增距離 = 2 * H * (1/2)^(i-1)(上升+下降)n 次反彈高度 = H * (1/2)^nH + 2*H*Σ(1/2)^i (i=1..n-1) = H * (3 - (1/2)^(n-2)) (n≥2)#include <stdio.h>
#include <math.h>
int main(void) {
double height; // 初始高度,用 double 保證精度
int n; // 次數
double distance = 0.0;
double current_height;
// 輸入處理:兼容 scanf 返回值判斷 EOF
if (scanf("%lf %d", &height, &n) != 2) return 1;
current_height = height;
distance = height; // 第一次下落
// 循環累加第 2 到第 n 次落地的往返距離
for (int i = 1; i < n; i++) {
current_height /= 2.0; // 反彈高度遞減
distance += 2 * current_height; // 上升 + 下降
}
// 第 n 次反彈高度(循環結束時 current_height 已是第 n 次反彈高度)
double rebound_height = current_height / 2.0; // 注意:循環執行 n-1 次後 current_height = H*(1/2)^(n-1),再除2得第n次反彈
// 更直觀:rebound_height = height * pow(0.5, n);
printf("%.1f %.1f\n", distance, rebound_height);
return 0;
}
i < n 而非 i <= n,因第一次下落已單獨計算。pow(0.5, i) 更高效、精度更穩。%.1f 強制保留一位小數,符合題目要求。Input: 33 5
Output: 94.9 1.0
手算驗證:33 + 2*(16.5+8.25+4.125+2.0625) = 33 + 61.875 = 94.875 ≈ 94.9;第 5 次反彈 33/32 = 1.03125 ≈ 1.0。
掌握「首項單獨處理 + 迭代累加 + 邊界精確控制」模式,此類遞推數列問題迎刃而解。