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++;
};