题目
一个球从 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}')