1. 题目
一球从100米天空高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
2. 分析
- 经过路程分析:
- 第一次下落,球经过的路程就是初始高度100米。
- 第一次反弹后再次落下,经过的路程是第一次反弹高度的两倍(上去再下来),第一次反弹高度为 100 ÷ 2 = 50 100 \div 2 = 50 100÷2=50米,所以这一段经过的路程是 50 × 2 = 100 50×2 = 100 50×2=100米。
- 第二次反弹后再次落下,经过的路程是第二次反弹高度的两倍,第二次反弹高度为 50 ÷ 2 = 25 50 \div 2 = 25 50÷2=25米,这一段经过的路程是 25 × 2 = 50 25×2 = 50 25×2=50米。
- 以此类推,每次反弹后再次落下经过的路程都是该次反弹高度的两倍。
- 要求第10次落地时共经过的路程,需要累加每次下落和反弹落下经过的路程。
- 第n次反弹高度分析:
- 每次反弹高度都是上一次落地高度的一半,所以第n次反弹高度可以通过初始高度依次除以2的n次方得到。
3. 实例代码
#include <stdio.h>
int main() {
double height = 100; // 初始高度
double totalDistance = 100; // 初始总路程为第一次下落的100米
int n = 10; // 落地次数
// 计算每次反弹后再次落下经过的路程并累加
for (int i = 1; i <= n; i++) {
height /= 2;
printf("第%d次落地时,反弹高%f米\n", i, height);
totalDistance += 2 * height;
}
printf("第10次落地时,共经过%f米。\n", totalDistance);
printf("第10次反弹高度为%f米。\n", height);
return 0;
}
- 变量
height
表示球的当前高度(初始为100米),totalDistance
表示球总共经过的路程(初始为第一次下落的100米),以及n
表示落地次数(设置为10)。 - 通过
for
循环,模拟球每次反弹后再次落下的过程,在循环中更新height
为上一次高度的一半,并将本次反弹后再次落下经过的路程(即2 * height
)累加到totalDistance
中。 - 循环结束后,输出第10次落地时经过的总路程和第10次反弹高度。
4. 输出结果
5. 递归求解
#include <stdio.h>
// 递归函数计算每次落地后经过的路程
double calculateDistance(int n) {
if (n == 1) {
return 50;
} else {
return calculateDistance(n - 1) / 2;
}
}
int main() {
int n = 10; // 落地次数
// 计算第10次落地时经过的总路程,每次有往返,所以乘以2
double totalDistance = 100;
for (int i = 1; i < n; i++) {
totalDistance += 2 * calculateDistance(i);
}
// 计算第10次反弹高度
double tenthReboundHeight = calculateDistance(n);
printf("第10次落地时,共经过%f米。\n", totalDistance);
printf("第10次反弹高度为%f米。\n", tenthReboundHeight);
return 0;
}
6. 等比数列求解
#include <stdio.h>
#include <math.h>
int main(void) {
float initialHeight = 100; // 初始高度,即球第一次下落的高度
float commonRatio = 0.5; // 公比,表示每次弹起高度是上次落地高度的一半
// 计算第10次反弹高度
float tenthReboundHeight = initialHeight * pow(commonRatio, 10);
// 计算从第一次弹起再落下到第9次弹起再落下的路程和(不包括第一次下落的100米)
float sumWithoutFirstDrop = 2 * (initialHeight * commonRatio - tenthReboundHeight * commonRatio) / (1 - commonRatio);
// 计算第10次落地时经过的总路程(包括第一次下落的100米)
float totalDistance = sumWithoutFirstDrop + initialHeight;
printf("第10次落地时,共经过%.2f米。\n", totalDistance);
printf("第10次反弹高度为%.2f米。\n", tenthReboundHeight);
return 0;
}