import java.util.Scanner;
/**
* 100个人围成一圈,每个人有一个编码,编号从1开始到100,他们从1开始依次报数,
* 报到为M的人自动退出圆圈,然后下一个人接着从1开始报数,
* 知道剩余的人数小于M,请问最后剩余的人在原先的编号是多少?
* 例如输入M=3时,输出为:“58,91”,输入为M=4时,输出为:“34,45,97”。
*/
public class 约瑟夫环 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 控制台输入M, 表示间隔多少个人
int M = scanner.nextInt();
// 人的总个数
int N = 100;
boolean[] bArr = new boolean[N+1];
for (int i = 1; i <= N; i++) {
bArr[i] = true;
}
if (M <= 1 || M >= 100) {
throw new RuntimeException("ERROR!");
}
// i 用来表示循环,j 用来计算是不是第 N 个人
for (int i = 1, j = 0;; i++) {
if (bArr[i]) { // 此人还在
j++;
if (j == M) {
bArr[i] = false;
int K = 0;
for (int k = 1; k <= N; k++) {
if (bArr[k]) {
K++; // K 是剩余人数
}
}
if (K < M) {
for (int k = 1; k <= N; k++) {
if (bArr[k]) {
System.out.println(k);
}
}
break;
}
j = 0;
}
}
if (i == N) {
i = 0;
}
}
}
}
运行结果如下: