老鼠打洞
类型:流程控制
描述
《九章算术》的“盈不足篇”里有一个很有意思的老鼠打洞问题。原文这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何日相逢?各穿几何?
这道题的意思就是说,有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打一尺,小老鼠也是一尺。大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。问它们几天可以相逢,相逢时各打了多少。
(注:本题禁止使用幂运算)
输入格式
输入1个整数,代表墙的厚度,单位为尺
输出格式
第一行输出1个整数,表示相遇时所需的天数
第二行输出2个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1位数字。
示例
输入:10输出:41.8 8.2
标准答案
n = int(input())rat, mouse, day, time = 1, 1, 0, 1distance_of_rat, distance_of_mouse = 0, 0 # 大老鼠和小老鼠的打洞距离while n > 0:if n - mouse - rat < 0:time = n / (mouse + rat)n = n - mouse - ratdistance_of_mouse = distance_of_mouse + time * mousedistance_of_rat = distance_of_rat + time * ratrat = rat * 2mouse = mouse / 2day = day + 1print(day)print(round(distance_of_mouse, 1), round(distance_of_rat, 1))
我的答案
def big_m(n): # 大老鼠每天打洞进度if n == 1:return 1else:return 2*big_m(n-1)def lit_m(n): # 小老鼠每天打洞进度if n == 1:return 1else:return 0.5*lit_m(n-1)t = int(input()) # 墙厚度big_t,lit_t = 0,0 # 大老鼠和小老鼠分别累计的打洞距离n=1time = 1while t>0:# 如果当天剩余厚度不够它们今天要挖的距离,则大老鼠实际挖距=剩余厚度*(大老鼠理论挖距/(大小老鼠理论挖距之和))if t - big_m(n)-lit_m(n)<0: time = t / (big_m(n)+lit_m(n)) # 实际/理论的比例t -= big_m(n) + lit_m(n)big_t += time * big_m(n) # 若t<0,大老鼠实际挖距要按比例time计算,若t>=0,time为1lit_t += time * lit_m(n) # 若t<0,小老鼠实际挖距要按比例time计算,若t>=0,time为1n += 1print(n-1)print('{:.1f} {:.1f}'.format(lit_t,big_t))