国王要杀100个和尚中的99个(约瑟夫环)
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
采用PHP实现约瑟夫环:
1 $n = 100; 2 $m = 5; 3 $k = 1; 4 function lastOne($n, $m, $k){ 5 if($k > $n){ 6 $k = $k % $n; 7 } 8 for($i = 1; $i <= $n; $i++){ 9 $monk[$i] = $i; 10 } 11 $kill_num = 0; 12 do{ 13 foreach($monk as $num => $v){ 14 if(isset($k) && $k != $num){ 15 continue; 16 } else { 17 unset($k); 18 } 19 $kill_num++; 20 if($kill_num % $m == 0 && count($monk) > 1){ 21 unset($monk[$num]); 22 $kill_num = 0; 23 } 24 } 25 }while(count($monk) > 1); 26 reset($monk); 27 return current($monk); 28 } 29 echo "<pre>"; 30 print_r(lastOne($n, $m, $k)); 31 echo "</pre>";