国王要杀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>";

 

posted on 2014-06-22 13:09  Jacky Yu  阅读(384)  评论(0编辑  收藏  举报