2345 · 移动距离计算(Python 版)

503 阅读2分钟

题目

一个球从 100 米高度自由落下,每次落地后会反弹回原来一半的高度。请从标准输入流(控制台)中获取一个正整数 n,通过 print 语句输出小球从开始到第 n 次接触地面时总共经过的距离到标准输出流(控制台),单位为米,结果保留两位小数。

样例

评测机会通过执行命令 python main.py 来执行你的代码,并将 n 作为标准输入从控制台输入。你的代码需要从标准输入流(控制台)中读入数据 n,计算出结果后通过 print 打印到标准输出流(控制台)中。

解法1:(累加)

n = int(input())
# 初始化的时候先行加上开头直接下落的 100 米
total = 100
# 初始化第一次反弹高度
height_n = total / 2
# 累加第 2 次接触地面到第 n 次接触地面经过的距离
for i in range(2, n + 1):
    total = total + 2 * height_n
    height_n = height_n / 2
# 输出保留两位小数的结果
print(f'{total:.2f}')

解法2:(位运算)

我们发现小球每次落地后会反弹回原来一半的高度,那么每次高度都会减少一半,高度依次为原来的 1/2, 1/4, 1/8......1/n,对他们进行累加可以得到结果,注意这次列出的只是高度,上升下降要计算两遍,不要忘记乘以 2。

n = int(input())

total = 100 + sum(100 / (1 << i) for i in range(n - 1))
print(f'{total:.2f}')

解法3:(等比数列求和)

通过上边的讨论,我们可以发现小球每次接触地面经过的距离为一个等比数列,等比数列可以使用求和公式进行计算

n = int(input())

total = 100 + 100 * (1 - 1 / (1 << n - 1)) / (1 - 0.5)
print(f'{total:.2f}')