第42期-猴子分桃

1 问题描述

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,
第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
用python解决这个数学难题吧!

2 解题思路

  • 第一步: 五次相同的动作,for循环
  • 第二步: 由于不确定最后的桃子数量,所以需要使用while循环来尝试,直到满足条件为止

3 解题方法

第42期-猴子分桃
n = 1
while True:
    try:
        b = n
        for i in range(5):
            assert (b - 1) % 5 == 0
            b = (b - 1) / 5 * 4
        break
    except:
        n += 1
print(n)
View Code

第1行: 定义初始桃子数量为n并赋值为1
第2行: 从n=1开始尝试,无限循环知道满足条件
第3、9-10行: 使用try、except语句,若满足条件则结束循环,不满足条件则报错并让n+1进行下次循环
第4行: 定义变量b并将n的值赋值给b,这样可以不改变原本n的值
第5行: for循环遍历五次
第6行: assert函数判断丢掉一个桃子后剩下的桃子是否可以被平分,是则继续下一步,否则报错进入except语句
第7行: 给b赋值拿走五分之一桃子后剩余的桃子数量
第8行: 五次循环过后表示这个数符合题意,结束循环
第11行: 打印桃子数量

代码运行结果为:
第42期-猴子分桃

小思考

这里用到了for、except语句与assert函数结合的方式,简单讲解一下:
for、except语句在第四十期已经讲解过,try里面的内容如果报错,就会停止运行进入except后面的语句中
而assert函数会判断后面语句是否为True,若为False则报错
两者配合效果会意想不到,后面咱们会经常遇到

 

上一篇:python极简教程03:文件读写和异常处理


下一篇:第40期-报数