PHP实现 约瑟夫报数问题

8 篇文章 0 订阅

有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开始报。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值