题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
程序解析:
假设最后一只猴子拿走后还剩下sum_peach 4N,拿桃子前5N+1, 则 sum_peach = sum_peach/4 *5 +1
那再上一只猴子拿走后还剩下sum_peach 也是 4N,拿桃子前是 sum_peach = sum_peach/4 *5 +1
依次累积到第一只猴子拿,也是sum_peach 也是 4N,拿桃子前是 sum_peach = sum_peach/4 *5 +1
隐藏条件是N为整数,sum_peach/4 *5 +1 能被4整除
程序:
"""" 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个, 这只猴子把多的一个扔入海中,拿走了一份。 第二只猴子把剩下的桃子又平均分成五份,又多了一个, 它同样把多的一个扔入海中,拿走了一份, 第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子? """ # 假设最后一只猴子拿走后还剩下sum_peach 4N,拿桃子前5N+1, 则 sum_peach = sum_peach/4 *5 +1 # 那再上一只猴子拿走后还剩下sum_peach 也是 4N,拿桃子前是 sum_peach = sum_peach/4 *5 +1 # 依次累积到第一只猴子拿,也是sum_peach 也是 4N,拿桃子前是 sum_peach = sum_peach/4 *5 +1 # 隐藏条件是N为整数,sum_peach/4 *5 +1 能被4整除 num_monkey = 0 # 倒数第几个猴子 last_num_peach = 1 # 最后分的桃子个数,假设为1个 sum_peach = 0 # 桃子个数 # while循环,直到累计到5只猴子,结束循环,否则一直循环,直到for循环累计到五只猴子 # for 累计五只猴子,j变化,每次丢桃子前x都是4的倍数,则上一次桃子有 x/4 *5 +1 while num_monkey<6: sum_peach = 4 * last_num_peach # 最后一只猴子拿走后还剩下的桃子 for num_monkey in range(1,6): if(sum_peach%4 !=0): break # 不能被整除,说明假设的last_num_peach不成立,跳出for循环,while循环继续,last_num_peach往上继续累加推测 else: num_monkey=num_monkey+1 sum_peach = sum_peach/4 * 5 +1 #最后一只猴子拿走后还剩下sum_peach 4N,拿桃子前5N+1, 则 sum_peach = sum_peach/4 *5 +1 last_num_peach = last_num_peach+1 #假设最后的桃子数不能被4整除了,则说明最后剩下的不为last_num_peach,则加1,直到所有sum_peach都能被4整除 print(sum_peach)