球從 100 米高度自由落下,每次落地反彈至原高度一半,再落下。求第 n 次落地時總經過路程、第 n 次反彈高度。
H = 100第 n 次落地總路程:S_n = H + 2×H×(1/2 + 1/4 + ... + 1/2^{n-1})
第 n 次反彈高度:H_n = H / 2^n
#include <stdio.h>
#include <math.h>
// 計算第 n 次落地總路程
float total_distance(float h, int n) {
if (n <= 0) return 0;
float sum = h; // 第一次下落
float current_h = h / 2;
for (int i = 2; i <= n; i++) {
sum += 2 * current_h; // 上升 + 下落
current_h /= 2;
}
return sum;
}
// 計算第 n 次反彈高度
float rebound_height(float h, int n) {
return h / pow(2, n);
}
int main() {
float h = 100.0;
int n;
printf("請輸入落地次數 n:");
scanf("%d", &n);
float dist = total_distance(h, n);
float height = rebound_height(h, n);
printf("第 %d 次落地總路程:%.2f 米\n", n, dist);
printf("第 %d 次反彈高度:%.2f 米\n", n, height);
return 0;
}
請輸入落地次數 n:10 第 10 次落地總路程:299.80 米 第 10 次反彈高度:0.10 米
反彈高度:100 / 2^10 = 100 / 1024 ≈ 0.0977 ≈ 0.10
總路程:100 + 2×50 + 2×25 + 2×12.5 + ... + 2×(100/512) = 100 × (1 + 1 - 1/512) = 299.80 ✓
typedef struct {
float initial_height;
float rebound_ratio; // 反彈係數 (0.0-1.0)
float gravity; // 重力加速度 (可選)
} PhysicsParams;
float total_distance_general(PhysicsParams *p, int n) {
float sum = p->initial_height;
float h = p->initial_height * p->rebound_ratio;
for (int i = 2; i <= n; i++) {
sum += 2 * h;
h *= p->rebound_ratio;
}
return sum;
}