描述:
《九章算术》的“盈不足篇”里有一个很有意思的老鼠打洞问题。原文这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何日相逢?各穿几何?
这道题的意思就是说,有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打一尺,小老鼠也是一尺。大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。问它们几天可以相逢,相逢时各打了多少。
输入格式
输入1个整数,代表墙的厚度,单位为尺
输出格式
第一行输出1个整数,表示相遇时所需的天数
第二行输出2个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1位数字。
n=int(input())
day=0
big=small=1
length_mouse=0
length_big=length_small=0
while length_mouse<=n:
length_mouse+=(big+small)
length_big+=big
length_small+=small
big=big*2
small=small/2
if(length_big+length_small)>=n:
length_big-=big
length_small-=small
overlength=n-length_big-length_small
length_big=length_big+big/(big+small)*overlength
length_small=length_small+small/(big+small)*overlength
day+=1
print(day)
print("{:.1f} {:.1f}".format(length_small,length_big))
第二种方法:
n = int(input())
rat, mouse, day, time = 1, 1, 0, 1 #大老鼠进度,小老鼠进度,相遇时间,第一天时间
distance_of_rat, distance_of_mouse = 0, 0 # 大老鼠和小老鼠的打洞距离
while n > 0:
if n - mouse - rat < 0: #第一天打洞完成
time = n / (mouse + rat) #算出需要时间
n = n - mouse - rat #剩余墙厚
distance_of_mouse = distance_of_mouse + time * mouse
distance_of_rat = distance_of_rat + time * rat
rat = rat * 2 #大老鼠每天进度
mouse = mouse / 2 #小老鼠每天进度
day = day + 1 #时间过去一天
print(day)
print(round(distance_of_mouse, 1), round(distance_of_rat, 1))