皮球從高度 H 自由落下,觸地後反彈至原高度一半,再落下,循環往複。求第 n 次落地時總路程、第 n 次反彈高度。輸入 H、n(長整數範圍),輸出保留一位小數。
#include <stdio.h>
#include <math.h>
int main(void) {
double H;
int n;
printf("Input height: ");
scanf("%lf", &H);
printf("Input n: ");
scanf("%d", &n);
double distance = H; // 初始下落
for (int i = 1; i < n; i++) { // 第 1 到 n-1 次反彈各經歷上升+下落
distance += 2 * H * pow(0.5, i);
}
double height = H * pow(0.5, n); // 第 n 次反彈高度
printf("%.1f %.1f\n", distance, height);
return 0;
}
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;反彈高度 33/32 = 1.03125 ≈ 1.0。
利用等比數列求和公式或迴圈累加均可解決。迴圈寫法直觀易懂,效能在 n 較小(長整數範圍)下完全足夠。