python百炼成钢实例080-猴子分桃

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

程序解析:

假设最后一只猴子拿走后还剩下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)

 

 

 

posted @ 2021-12-31 10:02  依羽杉  阅读(775)  评论(0编辑  收藏  举报