题目描述
n个人的编号是1 ~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
(报数是从1报起)当报到K的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
求最后剩下的人的编号。这就是著名的约瑟夫环问题。
本题目就是已知n,k的情况下,求最后剩下的人的编号。
输入描述:
输入是一行,2个空格分开的整数n, k (0 < n, k < 107)。
输出描述:
要求输出一个整数,表示最后剩下的人的编号。
输入输出样例
示例
输入
10 3
输出
4
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class YuesefuRound {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in=new Scanner(System.in);
int n,k;
n=in.nextInt();
k=in.nextInt();
//System.out.println(n+k);
List<Integer> list=new ArrayList<>();
for(int i=1;i<=n;i++) {
list.add(i);
}
int index=0;
// index 表示当前索引
// k 表示要移动的步数
// 首先将当前的索引值加上 k(要移动的步数),然后减去 1(因为索引通常是从 0 开始的)。
// 最后对列表的大小取余,确保结果在合法的索引范围内。
while(list.size()>1) {
index=(index+k-1)%list.size();
list.remove(index);
}
System.out.println(list.get(0));
}
}