import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int N; N = scan.nextInt(); int[] array = new int[N]; for(int i = 0; i < N; i++){ array[i] = 0; } int remain = N; int flag = 0; int j = 0; while(remain > 1){ if(array[j] == 0){ flag++; if(flag == 3){ array[j] = 1; remain--; flag = 0; } } j = (j + 1) % N; // 确保下标在 [0, N-1] 范围内循环 } for(int i = 0; i < N; i++){ if(array[i] == 0){ System.out.println(i + 1); // 输出最后剩下的人的编号 } } } }
这段代码是一个经典的约瑟夫问题(Josephus problem)的解法。下面是代码的逻辑解释:
- 首先通过
Scanner
类获取输入的整数 N,表示参与游戏的人数。 - 创建一个大小为 N 的整型数组
array
,并初始化所有元素为 0。数组中的每个元素表示对应位置的人是否仍在游戏中,0 表示在游戏中,1 表示已出局。 - 使用
remain
变量记录剩余未出局的人数,初始值为 N。 - 使用
flag
变量来记录报数的次数,每报数到 3 就将对应位置的人出局。 - 使用变量
j
来表示当前报数的人的位置,初始值为 0。 - 进入循环,直到剩余未出局的人数为 1,即游戏结束。
- 在循环中,判断当前位置的人是否还在游戏中,如果是则增加
flag
,当flag
达到 3 时,将该位置的人标记为出局,同时更新剩余未出局的人数和重置flag
。 - 更新当前报数的人的位置
j
,确保循环报数。 - 循环结束后,遍历数组找到最后剩下的人(数组元素值为 0)的位置,并输出其编号(位置加 1)。