public class Suanfa11 {
// 11、约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
// 从编号为k的人 开始报数,数到m的那个人出列;
// 他的下一个人又从1开始报数,数到m的那个人又 出列;
// 依此规律重复下去,直到圆桌周围的人全部出列
//问最后一个是谁
public static void main(String[] args) {
int n=6;//总人数
boolean[] arr= new boolean[n+1];
for(int i=1;i<=n;i++) {
arr[i]=false;//未出列是false
}
int k=1;//开始的位置
int m=5;//间隔的个数
int m1=0;//动态报的数
int len=n;//检测是否到最后一个
while(len!=1) {//当未出列的人大于一个的时候
for(int i=k;i<arr.length;i++) {
if(arr[i]==false) {//判断i编号的人是否出列 出列就跳过 未出列就报数
m1++;//未出列,报数
}if(m1==m) {//报到第m个数的时候
arr[i]=true;//i编号出列
System.out.println(i);
//判断报到哪个编号了 定位下一次开始报数的编号
//即使i+1得人已经出列 也没关系 就随着循环向后走呗
if(i==arr.length-1) {
k=1;
}else {
k=i+1;
}
m1=0;//重新开始报数
len--;//数组中的未出列人少了一个
break;
//循环走到最后 就重新开始循环
}if(i==arr.length-1) {
i=0;
}
}
}
for(int i=1;i<arr.length;i++) {
if(arr[i]==false) {
System.out.println(i);
}
}
}
}