題目:有17個人圍成一圈(編號0~16),從第0號的人開始從1報數,凡報到3的倍數的人離開圈子,然後再數下去,直到最後只剩下一個人爲止,問此人原來的位置是多少號?
思想:1.設定數組,把這些人按照編號存入數組,且加一個標記位,0代表沒有被移出,1代表移出。
2.執行無限循環,在每一次循環中,對整個數組進行遍歷,判斷每個數組元素的標記爲是否爲0,如果爲0則繼續報數,如果此數能被3整除,該數組元素標記位設爲1,並且移出的總人數+1。當移出總人數達到16人,則break退出無限循環,剩下的爲勝者。
代碼:
<?php $person = array ( array("0",0), array("1",0), array("2",0), array("3",0), array("4",0), array("5",0), array("6",0), array("7",0), array("8",0), array("9",0), array("10",0), array("11",0), array("12",0), array("13",0), array("14",0), array("15",0), array("16",0), ); //報數 $j = 0; //移出位人數 $num = 0; //執行循環 while(1) { //遍歷整個數組 for($k=0;$k<17;$k++) { //如果此數組元素沒有移出位 if($person[$k][1]==0) { //此數組元素繼續報數 $j=$j+1; //如果報的數能被3整除 if($j%3==0) { //此數組元素標記移出位 $person[$k][1]=1; //出位人數+1 $num=$num+1; } } } //如果出位人數達到16人,則最後一人獲勝,退出循環 if($num==16) { break; } } var_dump($person) ; ?>結果:
array (size=17) 0 => array (size=2) 0 => '0' (length=1) 1 => 1 1 => array (size=2) 0 => '1' (length=1) 1 => 1 2 => array (size=2) 0 => '2' (length=1) 1 => 1 3 => array (size=2) 0 => '3' (length=1) 1 => 1 4 => array (size=2) 0 => '4' (length=1) 1 => 1 5 => array (size=2) 0 => '5' (length=1) 1 => 1 6 => array (size=2) 0 => '6' (length=1) 1 => 1 7 => array (size=2) 0 => '7' (length=1) 1 => 1 8 => array (size=2) 0 => '8' (length=1) 1 => 1 9 => array (size=2) 0 => '9' (length=1) 1 => 1 10 => array (size=2) 0 => '10' (length=2) 1 => 0 11 => array (size=2) 0 => '11' (length=2) 1 => 1 12 => array (size=2) 0 => '12' (length=2) 1 => 1 13 => array (size=2) 0 => '13' (length=2) 1 => 1 14 => array (size=2) 0 => '14' (length=2) 1 => 1 15 => array (size=2) 0 => '15' (length=2) 1 => 1 16 => array (size=2) 0 => '16' (length=2) 1 => 110號位的人爲所求解