约瑟夫环(约瑟夫问题)
题目描述
有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>
运行结果