分类
编程

海滩上有一堆桃子,五只猴子来分

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

最后剩下4堆,每堆有255个,程序中,第7行,要到4×255,才能从双循环跳出。

这个题,看似倒推法,但若让小升初学生纸笔计算,根本不可能,计算量太大。初中生,可以解方程。

程序思路:第6行,按照4的倍数枚举,这是沙滩上最后剩下的桃子数。第8行,一个数,不能被4整除,就不可能是上次拿完剩下的总数,就不考虑了,就break。就从for循环跳出,进入到while循环,实验下一个4个倍数。如果一个数,能让for循环进行到5,则5个猴子轮完。x/4相当于给j减了一个1

12行break后,到17行,然后到5行。

第5行,0<5,true,第7行,x=4,第9行,i=0,
第11行,false,第14行,i=1,第15行x=6
第5行,1<5

程序运行结果:

while i= 0
inside while x= 4
for i= 0
inside for x= 6.0
for i= 1
while i= 1
inside while x= 8

第5行再进while循环后,第9行for,i要从0重新开始

下面这个算法不对:最后沙滩上剩下4个,这是最少情况。

设最后每分1个,多1,那么是6
那么第4次是6×5+1=31
第3次是31×5+1=156
第2次156×5+1=781
第1次781×5+1=3906

最后一个猴子如果面对6个,这6个,是上次5份中的4份,上次应该是:6÷4×5+1,这不是整数,就不行。

这对应着程序的第11行,能被4整除,才能走到第15行,
往上倒推一步。

最后沙滩上剩下4的倍数,如果是4×1,就推不回去,那就再实验4×2

以下方程手书,由数学灵活就业部落成员提供:

if __name__ == '__main__':
    i = 0
    j = 1
    x = 0
    while (i < 5) :
        print("while i=",i)
        x = 4 * j
        print("j=",j)
        print("inside while x=" ,x)
        for i in range(0,5) :
            print("for i=",i)
            if(x%4 != 0) :
                break
            else :
                i += 1
            x = (x/4) * 5 +1
            print("inside for x=" ,x)
        j += 1
    print (x)