NC2227_约瑟夫环
- 电脑硬件
- 2025-09-17 08:48:02

题解:
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开始的编号。
NC2227_约瑟夫环由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“NC2227_约瑟夫环”