题解:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int m = sc.nextInt();
int set = 0;
for(int i = 2;i <= n;i ++){
set = (set + m) % i;
}
System.out.println((set + k)%n);
}
}
解题思路:
n:总人数
k:开始报数的人的编号
m:每次数到m的人出队
set:记录每次循环后剩余人的位置偏移量
位置偏移量的概念:在每一轮报数结束后,由于有人出队,剩下的人的位置会发生变化。位置偏移量表示的是由于出队操作导致最后一个人位置变化的量。这个量在每一轮中累加,并用于计算下一轮结束后最后一个人的新位置。
-
初始化:首先创建一个
Scanner
对象来读取输入的值,包括总人数n
、起始编号k
和报数的最大值m
。 -
计算过程:
-
使用一个变量
set
来记录每轮报数后剩余人的位置偏移量。 -
从第二个人开始(即
i=2
),逐个计算到第n
个人。 -
在每一轮中,更新
set
的值为(set + m) % i
。这个公式的含义是:上一轮结束时的位置加上本轮需要报数的次数m
,然后对当前剩余的人数i
取模,得到新的位置偏移量。
-
-
输出结果:
-
最后,通过
(set + k ) % n
计算出大王的编号。这里(set + k )
是将0-based索引转换为1-based索引,然后对n
取模确保结果在合法范围内,最后加1是因为Java中的数组是从0开始的,而题目要求的是从1开始的编号。
-