算法,约瑟夫问题

<?php
/**
 * 跟猴子问题比较相似,最后一个是大王。约瑟夫是最后两个是存活。
 * 约瑟夫问题是个有名的问题:
 * N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
 * 例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
 */

 function getLastTwo() {
     $people = 41;
     $killNum = 3;

     // 初始化数据
     $people_arr = range(1,$people);

     for ($i = 1 ; $i <= $killNum * ($people -2);$i++) {
        $speak_num = array_shift($people_arr);
        if ($i % $killNum == 0) {
            echo "死了".$speak_num."<br/>";
        } else {
            // 放到后面
            array_push($people_arr,$speak_num);
        }
     }

     // 输出活着的人
     foreach($people_arr as $alive) {
         echo "我".$alive."还活着!<br/>";
     }
 }

 getLastTwo();

结果:

死了3
死了6
死了9
死了12
死了15
死了18
死了21
死了24
死了27
死了30
死了33
死了36
死了39
死了1
死了5
死了10
死了14
死了19
死了23
死了28
死了32
死了37
死了41
死了7
死了13
死了20
死了26
死了34
死了40
死了8
死了17
死了29
死了38
死了11
死了25
死了2
死了22
死了4
死了35
我16还活着!
我31还活着!
posted @ 2020-01-14 00:49  TBHacker  阅读(209)  评论(0编辑  收藏  举报