约瑟夫环(约瑟夫问题)

该文章通过一个编程示例解释了如何解决约瑟夫环问题,使用一个长度为10的数组模拟10个俘虏的生存状态,通过while循环实现报数和淘汰过程,直至只剩一人。在循环中,当俘虏报数到3时会被淘汰,同时记录被淘汰的顺序。最后,遍历数组找出最后存活的俘虏编号。
摘要由CSDN通过智能技术生成

约瑟夫环(约瑟夫问题)
题目描述
有10个俘虏(以编号1,2,3…10分别表示)围坐在一起。从编号为1的人开始报数,数到3的那个人被拉出去枪毙;他的下一个人又从1开始报数,数到3的那个人又被拉出去枪毙;依此规律重复下去,直到最后一个人,求最后剩下的的那个人的编号,并输出被枪毙人的编号顺序?(经典思考题)。
思路由题意知:开始为10人,结束时剩1人。那如果定义一个长度为10的一维数组来存储这10个俘虏,然后用一个while循环实现枪毙过程,那循环终止的条件就是只剩一人。(注意!!这里为什么使用while循环,不使用for循环???因为我们只知道循环终止的条件,至于具体循环多少次我们不知道。这种情况下,我们一般考虑while循环)
代码

<script>
    var arr7 = [1,1,1,1,1,1,1,1,1,1];                    //1代表存活状态,0代表死亡状态
    var num = 10;                                        //存活总人数
    var count = 0;                                       //报数
    var i=0;                                             //循环时的数组下标
    var j=0;                                             //记录被枪毙的顺序
    while(num > 1){                                      //循环终止的条件,剩一人
        if(arr7[i] == 1){                                // 下标为i的俘虏还活着
           count++;                                      //活着就报数
           if(count == 3){                               //报到3枪毙
            num-- ;                                      //总数减1
            count = 0 ;                                  //枪毙后重新报数
            arr7[i] = 0;                                 //生命状态置为0
            j++;                                         //记录被枪毙的顺序
            document.write("第"+j+"个被枪毙的人为:"+ (i+1));
            document.write("<br/>");
           }
        }
        i++;                                             //每判断一个数组下标加1
        if(i == arr7.length){                            //一圈之后,重新开始(实现闭环)
            i=0;
        }   
    }
    // 最后循环判断谁是最后活着的人(生命状态为1的人)
    for(var i=0; i < arr7.length; i++){
        if(arr7[i] == 1){
            document.write("最后活着的人是"+(i+1));
            break;
        }    
    }
</script>

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值