经典问题约瑟夫环
有500个人围城一个圈,依次报数,每数到3的倍数的人离开圈,数完一圈后继续从1开始数,
直到圈中剩下最后一个人,求剩下的人原来在圈中的位置(约瑟夫环问题)
数组循环输出
1.唯一需要注意的问题,设置具体数值的时候小心下表越界的问题就好。
2.详细解题过程写在以下代码块中。
代码块
public static void main(String[] args) {
//将这500人放到一个boolean类型的数组中
boolean [] b = new boolean[500];
for(int i = 0 ; i < b.length; i++) {
b[i] = true;
}
//当前遍历到的索引
int index = 0;
//初始化一个计数器
int count = 0;
//数组的长度
int len = b.length;
//当len=1的时候跳出循环,表示只剩下一个人
while(len > 1) {
//判断这个人是否在环内
if(b[index]) {
count ++;
if(count == 3) {
//如果达到3就让这个人离开
b[index] = false;
//总人数减少一人
len--;
//计数器归零
count = 0;
}
}
index++;
//判断是否已经循环一圈
if(index == b.length) {
index = 0;
}
}
//对数组进行遍历
for(int i = 0; i < b.length; i++) {
//获取每一个的结果
if(b[i]) {
//如果一个元素为ture ,则表示最后一个人
System.out.println("最后剩下的人在原来圈中的位置:"+i);
break;
}
}
}
}
总结
1.这是一个很经典的数学问题,在学习数组的过程中面对这类问题,可以有助于自身对各种类型数组的理解
2.当学习数组过后,可以练习这类相关题目,对数组进行进阶发展。