Java
中约瑟夫问题实例的两种解法:
问题:设
500
个小孩围成一圈,指定其中一个小孩的
id
为
1
,从他开始数数,数到
3
的位置的小孩退出,然后从下
一个小孩继续数数,数到
3
的继续退出;如此一直循环,直到只剩下最后一个小孩,打印出他的
id
1.
数组算法
public class ThreeQuit1 {
public static void main(String[] args) {
int[] kid = new int[500];
//
新建一个数组存储小孩的
id
,
id
从
1
开始
for(int i=0; i
kid[i] = i + 1;
}
int kidLeft = kid.length;
//
剩余小孩的数量,初始值和总数一样
int count = 0;
//
计数器
while(kidLeft > 0) {
//
圈里如果还有小孩就一直循环
for(int i=0; i
if(kid[i] != -1) {
//
已经用
-1
标记的位置不再计数
count++;
if(count == 3) {
//
数到
3
时执行以下操作
count = 0;
//
计数器清零
kidLeft--;
//
剩余小孩的数量递减
1
if(kidLeft == 0) {
//
到最后一个小孩时输出
id
System.out.println("
最后一个出圈的是:
" + kid[i]);
}
kid[i] = -1;
//
查到
3
位置用
-1
标记
}
}
}
}
}
}
2.
面向对象的双循环链表解法