题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入
10 3
输出
3 6 9 2 7 1 8 5 10 4
说明/提示
1 ≤ m, n ≤ 100
思路
- 这道题用集合来写会更简单一点,先把 1 ~ n 放进一个 ArrayList 集合中,将它们按顺序编号
- 再定义一个指针变量,表示出圈人的下标,初始化为零。每次都要加上 m 得出需要出圈人的下标(需要%集合内元素的个数,防止越界),找了之后把它打印出来后再通过 remove 方法移除需要出圈的元素
- 直到集合内没有元素时就退出循环
代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = 0;
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
list.add(i);
}
while (!list.isEmpty()) { //集合内有元素就需要找出出圈人
k = (k + m - 1) % list.size(); //-1 是因为集合中元素的下标是从 0 开始的
System.out.printf("%d ", list.get(k));
list.remove(k); //移除出圈的元素,集合内的元素会自动填补空缺
}
}
}