`
923723914
  • 浏览: 628100 次
文章分类
社区版块
存档分类
最新评论

PHP实现 约瑟夫报数问题

 
阅读更多

有10个人报数,从1,2,3开始报,但有人喊道3时,退出。然后从退出的后面一个人开始重新报数,数到3的人又退出,直到剩下最后一个人。

    $inCir = array();

    // 如果有10个人, 每个人都在圆圈内
    for ($i=1; $i<=10; $i++) {
        $inCir[$i] = 1;
    }

    $countPeople = count($inCir);

    // 开始报数
    $callNo = 0;

    // 从第一个人开始报数
    $peopleNo = 1;

    // 出去的人人数
    $outCir = 0;

    // 当只有一个人的时候,停止循环
    while($outCir !== $countPeople - 1) {

        // 如果此人么有出去,则继续报号
        if ($inCir[$peopleNo] == 1) {
            $callNo++ ;
        }

        //如果此人报数为3 则设置为已经出去
        if ($callNo === 3) {
            $inCir[$peopleNo] = 0;
            $outCir++;
            // 重新开始报号
            $callNo = 0;
        }

        // 该下一个人报号
        $peopleNo = $peopleNo + 1;

        // 如果到第10个人,则有重新回到第一个人
        if ($peopleNo > $countPeople) {
            $peopleNo = 1;
        }
    }

    for ($i=1; $i<=$countPeople; $i++) {
        if ($inCir[$i] == 1) {
            echo $inCir[$i];
        }
    }

在做这个题目遇到的问题:

初始化报数从1开始,$callNo=1 因为我想到的是从1开始报数。 这样做有一个问题是,第二个人就报3了,事实上应该是第三个人报3,这是为什么呢?

因为,如果报数从1开始,检测第一个人是否被踢出去,自然没有被踢出去出去,报数变成2。 接下来,就是轮到第二个人,检测第二个人也没有出去,然后 注意,这个时候,报数变成3了,最终判定这个人要被踢出去,但此时这个人还是第二个人,报数增加1之后,才轮到下一人!!

这个问题,就是报数报早了,所以 必须从0开始报。

分享到:
评论

相关推荐

    用数组实现约瑟夫出圈问题

    用数组实现约瑟夫出圈问题。 n个人排成一圈,从第一个人开始报数,从1开始报,报到m的人出圈,剩下的人继续开始从1报数,直到所有的人都出圈为止。对于给定的n,m,编写程序求出所有人的出圈顺序。

    向量实现约瑟夫问题

    链表形式的约瑟夫很好实现,现在写了一个用线性表的向量存储结构来实现约瑟夫(Josephu)问题!

    java实现约瑟夫环问题Josephus

    java实现约瑟夫环问题Josephus 约瑟夫问题 * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k(1,2,3...n)的人开始报数,数到m(1,2,3...)的那个人出列; * 他的下一个人又从1开始报数,...

    用循环链表实现约瑟夫环问题

    使用c语言中的循环链表及结构体实现约瑟夫环问题

    单链表实现约瑟夫环

    单链表解决约瑟夫环问题

    Java递归实现约瑟夫环应用问题

    约瑟夫环是一个数学的应用问题: ...网上看到很多实现,唯独Java实现不好找,自己构思了一下思路,用递归的方式实现了一个Java版的约瑟夫问题解决方案,代码简洁,思路清晰,请各位同行参考,欢迎交流。

    1模拟轮盘抽奖游戏2模拟报数游戏(约瑟夫环问题)_抽奖轮盘_模拟报数游戏_模拟轮盘抽奖游戏_游戏_用python实现_

    1模拟轮盘抽奖游戏2模拟报数游戏(约瑟夫环问题)用python实现

    C++_循环链表实现约瑟夫问题

    C++_循环链表实现约瑟夫问题 vc2008 课堂作业!

    数组实现约瑟夫环的问题

    已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

    java链表实现约瑟夫问题

    约瑟夫问题,通过类实现的链表,并加以改进,做成双向链表

    用数组实现约瑟夫环的问题

    用数组实现约瑟夫环的数据结构 数组 约瑟夫环的问题

    利用循环链表实现约瑟夫问题的求解

    利用循环链表实现约瑟夫问题的求解。 约瑟夫问题如下:已知n个人(n&gt;=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依...

    约瑟夫环问题及设计程序实现约瑟夫环求解

    一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人...

    循环链表实现约瑟夫环问题

    循环链表实现约瑟夫环问题 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又...

    顺序表实现约瑟夫问题

    从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人开始重新从1报数,报到m时停止并且报m的人出列。如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,对任意给定...

    用两种方法实现约瑟夫环

    用两种方法实现约瑟夫环,链表法和数组法。总结比较简单

    java编写的循环链表来实现约瑟夫环

    循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释

    C和Python实现约瑟夫环问题

    分别用C语言和Python实现约瑟夫环问题,并生成可执行程序

    用单向循环链表实现约瑟夫环问题

    一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部...

    约瑟夫环问题用C++代码实现

    8. 【题目】约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又...

Global site tag (gtag.js) - Google Analytics