當前位置:才華齋>計算機>php語言>

PHP實現猴子選大王問題的演算法

php語言 閱讀(2.49W)

我們的事業就是學習再學習,努力積累更多的知識,因為有了知識,社會就會有長足的進步,人類的未來幸福就在於此。以下是小編為大家搜尋整理的PHP實現猴子選大王問題的演算法,希望對大家有所幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

PHP實現猴子選大王問題的演算法

  一、問題:

n只猴子圍坐成一個圈,按順時針方向從1到n編號。

然後從1號猴子開始沿順時針方向從1開始報數,報到m的猴子出局,再從剛出局猴子的下一個位置重新開始報數,

如此重複,直至剩下一個猴子,它就是大王。

設計並編寫程式,實現如下功能:

(1) 要求由使用者輸入開始時的猴子數$n、報數的最後一個數$m。

(2) 給出當選猴王的初始編號。

  二、解決方法:

?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748/*** @param int $n 開始時的猴子數量* @param int $m 報道的最後一個數*(報到這個數的猴子被淘汰,然後下一個猴子重新從①開始報數)* @return int 猴子的初始編號*/function monkeySelectKing($n,$m){//猴子的初始數量不能小於2if ($n<2){return false;}$arr=range(1,$n);//將猴子分到一個陣列裡, 陣列的值對應猴子的初始編號$unsetNum=0;//定義一個變數,記錄猴子的.報數for ($i = 2; $i <=$n*$m ; $i++)//總的迴圈次數不知道怎麼計算,{//不過因為迴圈中設定了return,所以$m*$len效率還可以foreach ($arr as $k => $v){$unsetNum++; //每到一個猴子, 猴子報數+1//當猴子的報數等於淘汰的數字時:淘汰猴子(刪除陣列元素)//報數歸0(下一個猴子從1開始數)if ($unsetNum==$m){// echo "<pre>";//開啟註釋,可以看到具體的淘汰過程// print_r($arr);unset($arr[$k]);//淘汰猴子$unsetNum=0;//報數歸零if (count($arr)==1)//判斷陣列的長度, 如果只剩一個猴子, 返回它的值{return reset($arr);}}}}}var_dump(monkeySelectKing(6, 3));

補充改進演算法(該演算法更加簡潔明瞭!):

?

123456789function yuesefu($n,$m) {$r=0;for($i=2; $i<=$n; $i++) {$r=($r+$m)%$i;}return $r+1;}print_r(yuesefu(3,3));