题目描述 一个球从100m高度自由落下,每次落地后反跳回原来高度的一半,再落下,再反弹.求它在第N次落地时共经过多少米? 输入 反弹的次数N 输出 小球经过的路程(保留四位小数) 样例输入 Copy 2 样例输出 Copy 200.0000
时间: 2025-01-18 16:08:53 浏览: 40
这是一个经典的物理问题,可以用递归来解决。我们可以编写一个C++程序来计算小球在第N次落地时共经过的距离。以下是解决方案和相应的代码:
```cpp
#include <iostream>
#include <iomanip>
using namespace std;
double calculateDistance(int n, double height = 100.0, double totalDistance = 0.0) {
if (n == 0) {
return totalDistance;
}
// 每次下落和反弹的距离
totalDistance += height;
height /= 2.0;
totalDistance += height;
return calculateDistance(n - 1, height, totalDistance);
}
int main() {
int n;
cin >> n;
double result = calculateDistance(n);
// 减去最后一次弹起的高度,因为题目只要求到落地时的距离
result -= 100.0 / pow(2, n);
cout << fixed << setprecision(4) << result << endl;
return 0;
}
```
解释:
1. 我们定义了一个递归函数 `calculateDistance`,它接受三个参数:
- `n`:剩余的反弹次数
- `height`:当前弹起的高度
- `totalDistance`:已经经过的总距离
2. 递归的基准情况是 `n == 0`,此时返回总距离。
3. 在每次递归调用中,我们首先加上当前下落的高度,然后计算新的反弹高度(原来高度的一半),并将其加到总距离中。
4. 主函数中,我们读取输入的反弹次数 `n`,然后调用 `calculateDistance` 函数。
5. 最后,我们减去最后一次弹起的高度,因为题目只要求到落地时的距离。
6. 使用 `fixed` 和 `setprecision(4)` 来确保输出结果保留四位小数。
这个程序能够正确计算小球在第N次落地时共经过的距离。对于样例输入 `2`,程序会输出 `200.0000`,这与题目给出的样例输出一致。
阅读全文
相关推荐



















