水手分椰子:用Scratch 巧解奥数题

网友投稿 2018-07-18 10:24

在一次航海中,有三名水手和一只猴子因船舶失事而被困在一个荒岛上,他们发现岛上仅有的食物是椰子。水分们齐心协力,劳累了一天,收集了许多椰子。天黑了,他们决定先去睡觉,等第二天起来后再分配椰子。

当天夜里,一个水手醒来,决定拿走属于他的那份椰子而不想等到早上。他把椰子分为相等的三堆,但发现多出了一个椰子,于是把这个椰子给了猴子。接着他藏好了自己那份椰子就去睡觉了。不久,另一个水手也醒来,他做了与第一个水手同样的事,也把多出的一个椰子给了猴子。而当第三个水手醒来后,他也跟前两个水手一样分了椰子,也把多出的一个椰子给了猴子。

第二天早晨,当三名水手起来时,他们决定把椰子平分为三堆,每人一份,并把多出的一个椰子也给了猴子。

小海豚科学馆请你算一算,水手们最少收集到多少个椰子?

【编程解题】

根据故事中的描述,每一个水手分椰子的过程是,把一个椰子给猴子,再把椰子平均分为3份,自己藏起一份,留下两份。水手们在头天夜里和第二天早晨共分了4次椰子。

小海豚科学馆推荐你采用枚举法,让椰子数从4开始递增,并判断椰子数能否用4次分完。如果刚好能分完则求得问题的解;否则继续增加椰子数,再模拟分椰子,直到刚好分完为止。

下面小海豚科学馆给出用枚举算法描述的流程图如下。

https://cdn.china-scratch.com/timg/180720/1024034415-0.jpg

接下来,根据上面介绍的算法,小海豚科学馆带你来编写主程序。

首先,我们创建一个名为“x”的变量,并赋初值为4;再用“重复执行直到……”指令构建一个循环结构,在循环体中逐一增加变量“x”的值。这就是一个枚举算法的基本结构。

https://cdn.china-scratch.com/timg/180720/1024035609-1.jpg

对于每一个“x”的值,我们调用模块“水手分椰子”进行检测,如果椰子能分完,则结束循环,输出问题的解。否则就继续检测下一个“x”的值。

https://cdn.china-scratch.com/timg/180720/1024032V8-2.jpg

接下来,我们还需要一个重要的模块 “水手分椰子”来检测列举的椰子数是否能分完。小海豚科学馆带你继续编写模块。

模块:水手分椰子

创建一个名为“水手分椰子”的模块,参数是一个名为“椰子”的数字参数。

https://cdn.china-scratch.com/timg/180720/1024032031-3.jpg

创建一个名为“椰子”的变量,并将参数“椰子”赋给变量“椰子”。请注意参数“椰子”和变量“椰子”的指令块颜色不同。

https://cdn.china-scratch.com/timg/180720/1024034434-4.jpg

接下来,在一个“重复执行……次”的循环结构中对变量“椰子”进行3次迭代。

根据故事描述,3名水手夜里先后偷偷分了3次椰子,每一次都是把1个椰子给了猴子,再把剩下的椰子均分为3份,自己藏起来1份,只留下2份。因此,这个过程可以表示如下:

https://cdn.china-scratch.com/timg/180720/1024033317-5.jpg

当天亮后,水手们一起又分了一次椰子。把一个椰子给了猴子,其余的均分成3份,一人一份。可以用下面等式表示:

https://cdn.china-scratch.com/timg/180720/10240422Y-6.jpg

然后把这个等式放入一个“如果……那么……否则”的条件判断指令中。

https://cdn.china-scratch.com/timg/180720/102404ME-7.jpg

如果条件满足,则把变量“椰子分完”设定为1,否则设定0。

到此,模块“水手分椰子”的代码编写完毕,模块的代码如下。

https://cdn.china-scratch.com/timg/180720/10240455Q-8.jpg

到这里,解决“水手分椰子”问题的全部代码编写完毕,小海豚科学馆给出完整代码清单如下。

        https://cdn.china-scratch.com/timg/180720/1024044946-9.jpg

点击绿旗运行程序,得到结果:椰子总数最少是79。

        https://cdn.china-scratch.com/timg/180720/1024042947-10.jpg

【试一试】

“水手分椰子”问题据说是伟大物理学家狄拉克提出的趣味数学题,曾登载在美国《星期六晚邮报》上。后经美国数学科普大师马丁·加德纳的介绍后更是广为流传。1979年,诺贝尔物理学奖获得者李政道博士在中国科技大学少年班讲学时,对“水手分椰子”问题作了简单变形,提出了一个五猴分桃的问题:

五只猴子采得一堆桃,它们约定次日早上起来分。半夜里,一只猴子偷偷起来,把桃均分成五堆后,发现还多一个,它吃了这桃子,拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃了这个桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。请问桃子数最少有多少个?

请你试一试,用Scratch编写程序求解这个问题。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com