import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//数组解决约瑟夫环问题
int[] p = new int[n];
int[] flag = new int[n];
for (int i = 0; i < n; i++) {
p[i] = i + 1; //初始化数组
flag[i] = 0; //初始默认都在圈里
}
//打印相关信息
//System.out.println(Arrays.toString(p));
//System.out.println(Arrays.toString(flag));
int c = 0; //当前喊的人的牌号
int k = 0; //当前喊的数
int targetNum = 3; //出圈口令,喊到3就出圈
int outNum = 0; //当前已出圈人数
while (outNum != n - 1){ //当当前已出圈人数 不等于 输入的人数时
c++; //1号位准备喊数
if (c > n){ //如果当前喊的人的位子大于所有人数
c = 1; //从头再来
}
if(flag[c-1] == 0){ //如果这个人在圈里
k++; //让他喊数
if (k == targetNum){ //如果喊得数是目标值3,就出圈
flag[c-1] = 1; //标志已出圈,不再参与下一轮
outNum++; //出圈人数增加
k = 0; //只要一喊到3,就初始化下一轮的喊数
//System.out.print(c + " "); //打印出圈顺序
}
}
}
//找到剩下的唯一flag=0的人并输出
for (int i = 0; i < flag.length; i++) {
if (flag[i] == 0){
System.out.println(p[i]);
}
}
}
}
Java数组方式解决约瑟夫环问题
最新推荐文章于 2023-04-15 20:18:36 发布