JavaScript解决约瑟夫环

JavaScript解决约瑟夫环

问题:100个人手拉手围成一个圆,开始数数,数到3的倍数的人退出,最后剩下一个人的是之前的第几个人?

该问题我们可以用数组来解决

思路:

一、我们先新建一个空数组,在数组中存入1-100的数值

二、把三的倍数的元素改为0,这时当元素为0时就不参加游戏

注意:当我们循环时,索引是一直在累加的。

所以当索引为100时,应该返回到第一个元素,即1;

当索引为101时,返回第二个元素:2;

当索引为102时,因为元素3在第一轮游戏时就已经变成0,所以跳过,第三个元素就变成4。

以此类推…我们可以用arr[index%100]来表示元素

//1.存1-100到新数组里
var arr = [];
    for (var i = 1; i <= 100; i++) {
        arr.push(i);
    };
    //索引
    var index = 0;
    //出局人数
    var out_num = 0;
    //报数人数
    var baoshu = 1;
//2.建立循环,只要出局人数不到100就一直继续
    while (out_num < 100) {
        //只要元素不为0,游戏就继续
        if (arr[index % 100] != 0) {
            //报到3的倍数的人,元素改为0
            if (baoshu % 3 == 0) {
                console.log("是第" + arr[index % 100] + "个人出局");
                //此时记录出局人数+1
                out_num++;
                arr[index % 100] = 0;
                //报数人数也要+1
                baoshu++;
            } else {
                //注意不为3的时候也要报数
                baoshu++;
            }
        }
        //索引会一直往后加
        index++;
    };
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值