資訊內容
水手分椰子:用Scratch 巧解奧數題
在一次航海中,有三名水手和一只猴子因船舶失事而被困在一個荒島上,他們發現島上僅有的食物是椰子。水分們齊心協力,勞累了一天,收集了許多椰子。天黑了,他們決定先去睡覺,等第二天起來后再分配椰子。
當天夜里,一個水手醒來,決定拿走屬于他的那份椰子而不想等到早上。他把椰子分為相等的三堆,但發現多出了一個椰子,于是把這個椰子給了猴子。接著他藏好了自己那份椰子就去睡覺了。不久,另一個水手也醒來,他做了與第一個水手同樣的事,也把多出的一個椰子給了猴子。而當第三個水手醒來后,他也跟前兩個水手一樣分了椰子,也把多出的一個椰子給了猴子。
第二天早晨,當三名水手起來時,他們決定把椰子平分為三堆,每人一份,并把多出的一個椰子也給了猴子。
小海豚科學館請你算一算,水手們最少收集到多少個椰子?
【編程解題】
根據故事中的描述,每一個水手分椰子的過程是,把一個椰子給猴子,再把椰子平均分為3份,自己藏起一份,留下兩份。水手們在頭天夜里和第二天早晨共分了4次椰子。
小海豚科學館推薦你采用枚舉法,讓椰子數從4開始遞增,并判斷椰子數能否用4次分完。如果剛好能分完則求得問題的解;否則繼續增加椰子數,再模擬分椰子,直到剛好分完為止。
下面小海豚科學館給出用枚舉算法描述的流程圖如下。
接下來,根據上面介紹的算法,小海豚科學館帶你來編寫主程序。
首先,我們創建一個名為“x”的變量,并賦初值為4;再用“重復執行直到……”指令構建一個循環結構,在循環體中逐一增加變量“x”的值。這就是一個枚舉算法的基本結構。
對于每一個“x”的值,我們調用模塊“水手分椰子”進行檢測,如果椰子能分完,則結束循環,輸出問題的解。否則就繼續檢測下一個“x”的值。
接下來,我們還需要一個重要的模塊?“水手分椰子”來檢測列舉的椰子數是否能分完。小海豚科學館帶你繼續編寫模塊。
模塊:水手分椰子
創建一個名為“水手分椰子”的模塊,參數是一個名為“椰子”的數字參數。
創建一個名為“椰子”的變量,并將參數“椰子”賦給變量“椰子”。請注意參數“椰子”和變量“椰子”的指令塊顏色不同。
接下來,在一個“重復執行……次”的循環結構中對變量“椰子”進行3次迭代。
根據故事描述,3名水手夜里先后偷偷分了3次椰子,每一次都是把1個椰子給了猴子,再把剩下的椰子均分為3份,自己藏起來1份,只留下2份。因此,這個過程可以表示如下:
當天亮后,水手們一起又分了一次椰子。把一個椰子給了猴子,其余的均分成3份,一人一份。可以用下面等式表示:
然后把這個等式放入一個“如果……那么……否則”的條件判斷指令中。
如果條件滿足,則把變量“椰子分完”設定為1,否則設定0。
到此,模塊“水手分椰子”的代碼編寫完畢,模塊的代碼如下。
到這里,解決“水手分椰子”問題的全部代碼編寫完畢,小海豚科學館給出完整代碼清單如下。
????????
點擊綠旗運行程序,得到結果:椰子總數最少是79。
????????
【試一試】
“水手分椰子”問題據說是偉大物理學家狄拉克提出的趣味數學題,曾登載在美國《星期六晚郵報》上。后經美國數學科普大師馬丁·加德納的介紹后更是廣為流傳。1979年,諾貝爾物理學獎獲得者李政道博士在中國科技大學少年班講學時,對“水手分椰子”問題作了簡單變形,提出了一個五猴分桃的問題:
五只猴子采得一堆桃,它們約定次日早上起來分。半夜里,一只猴子偷偷起來,把桃均分成五堆后,發現還多一個,它吃了這桃子,拿走了其中一堆。第二只猴子醒來,又把桃子均分成五堆后,還是多了一個,它也吃了這個桃子,拿走了其中一堆。第三只,第四只,第五只猴子都依次如此做了。請問桃子數最少有多少個?
請你試一試,用Scratch編寫程序求解這個問題。
聲明:本文章由網友投稿作為教育分享用途,如有侵權原作者可通過郵件及時和我們聯系刪除
