任务描述
本关任务:编写二鼠打洞的计算小程序。
相关知识
二鼠打洞问题
《九章算术》的“盈不足篇”里有一个很有意思的老鼠打洞问题。原文是这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何日相逢?各穿几何?
这道题的意思是:有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打一尺,小老鼠也是一尺。大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。问它们几天可以相逢,相逢时各打了多少。
请编程求此题的解,要求使用循环来完成,不允许使用幂运算。
编程要求
根据提示,在右侧编辑器补充代码,计算并输它们几天可以打通,相逢时小鼠和大鼠各打了多少。
测试说明
平台会对你编写的代码进行测试:
输入格式 输入为 1
个整数 wall
,代表墙的厚度,单位为尺。
输出格式 输出为两行,第一行输出 1
个整数,表示相遇时所需的天数。第二行输出 2
个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后 1
位数字。(提示:round(f,1)为浮点数 f
保留一位小数。)
示例 1
输入: 10 输出:
4 1.8 8.2
示例2
输入: 2 输出:
1 1 1
提示
最后一天可能不足一天便打通了
思路分析
仔细想了想为什么会有if分支呢,原因就是两鼠在即将相遇时的路程可能不用一天就能打通,if分支里就可以确保有这种情况发生时可以准确的算出两只老鼠的路程
代码实现
wall = int(input()) #墙壁的厚度
rat, mouse, day, time = 1, 1, 0, 1 #大鼠速度、小鼠速度、天数、当天工作时长(1表示工作一整天)
drat, dmouse = 0, 0 #大鼠路程、小鼠的路程
while wall > 0:
if wall - mouse - rat < 0: #第一天打洞完成
time = wall / (mouse + rat) #算出需要时间
wall = wall - mouse - rat #剩余墙厚
dmouse += time * mouse
drat += time * rat
rat = rat * 2 #大老鼠每天进度
mouse = mouse / 2 #小老鼠每天进度
day += 1
print(day)
print(round(dmouse, 1), round(drat, 1)) #使用round函数来保留小数点后一位