問題:一羣猴子排成一圈,按 1,2,...,n 依次編號。而後從第 1 只開始數,數到第 m 只,把它踢出圈,從它後面再開始數, 再數到第 m 只,在把它踢出去...,如此不停的進行下去, 直到最後只剩下一隻猴子爲止,那隻猴子就叫作大王。要求編程模擬此過程,輸入 m、n, 輸出最後那個大王的編號。 php
思考:按正常思路來講,應該是以一個猴爲起點(定位),開始日後數,又由於是個圈,從最後一個又轉到第一個,能夠認爲是在取餘。那麼我就按照我數猴的思惟模式開始寫程序了。主要利用的數組。c++
<?php function getking($n,$m){ $array=range(1,$n); $now=0;//初始化$now,爲定位標誌,也就是從它開始數 $nn=$n;//不破壞初始量 while($nn>1){ $now=($now+$m)%$nn;//計算該第幾個猴子出局了,由於是圈,取餘就夠了 if(!$now){$now=$nn;}//若是正好整除那麼這個猴子是最後一個(不是第0個) array_splice($array,$now-1,1);//去掉這個猴子 $nn--;$now--;//總數減小一個,標誌前移一個 } echo $array[0]; } getking(100,17);
ps. array_splice是我無心間發現的函數,由於unset一個數組元素後不會重建鍵值,這個函數能夠重建的。若是不是這樣我就從新循環定義一個新數組了。編程
我以爲這麼寫很是簡單,可是不知道爲何,關於這個題的解法中,沒有這麼寫的呢?基本都是c++的思路,動遊標來寫,是我寫的過低級了麼?數組