為了讓大家提高對循環(huán)以及判斷語句的掌握,今天分享一道經典題目《約瑟夫生者死者小游戲》。有三十個人在一條船上,但是超載了,需要十五個人下船,于是人們排成一隊,排隊的位置即是他們的編號(1-30),排好隊后,從排頭往排尾按照順序從1到9循環(huán)報數(shù),報數(shù)到9的人就下船,如此循環(huán),直到船上僅剩下15人。請問,有哪些人下了船?
通過解答這道題能夠提高大家繪制流程圖、理解循環(huán)體以及判斷結構的掌握程度(圖1)。
從流程圖中我們可以發(fā)現(xiàn)使用了一層循環(huán)、三層判斷。首先是循環(huán)報數(shù)(遍歷到最后一個再重新回到初始位置開始下一次遍歷)直到下船人數(shù)達到十五人。其次判斷遍歷的人是否還在船上,如果在,則報數(shù);否則的話跳過本次循環(huán),遍歷下一個人。最后是報數(shù)的內容,如果報數(shù)到9,那個人就要下船,計數(shù)器要返回1,并且下一次遍歷時就不考慮他,按照次序依次遍歷。相信大家如果能夠看懂流程圖,那么問題就可以迎刃而解了。
通過流程圖把程序的流程搞清楚之后,我們可以用任何編程語言把代碼寫出來,我這里選擇使用Python軟件來編寫,代碼如圖2。
首先外層people我選擇用字典來統(tǒng)計。按照循環(huán)的指示,初始情況給30個人都賦予了初始值為1。接下來新建三個變量check作為計數(shù)(0-9);i作為人們的編號(1-30);j為下船的人數(shù),一旦下船的人數(shù)等于15,退出循環(huán)。接下來我們使用一個while循環(huán)控制,因為只有30個人所以當i循環(huán)到超過30時,手動將i設置為1,進行重復的循環(huán)遍歷,當j等于15時,代表下船的人數(shù)達到約定人數(shù),跳出循環(huán)。
接下來就是本題最關鍵的環(huán)節(jié)——統(tǒng)計計數(shù)了。當people[i]為0時,表示此人已下船,i加1,繼續(xù)循環(huán),當people[i]為1時進行check統(tǒng)計,每次加1,當check等于9時,代表報數(shù)到9,對應人需要下船,將此人的people[i]值設置為0,顯示j為下船的人數(shù),下一個人j加1,運行效果如圖3。
本次實例主要考查對循環(huán)和判斷結構的理解能力,繪制流程圖是一項非常重要的技能,很多復雜的程序不可能上來就寫代碼,流程圖能夠幫助我們很好地捋順思路。