题目

模拟求解经典约瑟夫环问题(Josephus Problem):n 个人围成一圈(编号 1 到 n),从第 1 个人开始报数,数到 m 的人出列淘汰,下一个人重新从 1 开始报数,直到所有人出列。输出所有人的出列顺序。

输入格式:一行输入两个正整数 n 和 m,以空格分隔。

输出格式:按出列次序输出编号,每个编号后跟空格,末尾换行。

数据范围与约定:1 ≤ n ≤ 100,1 ≤ m ≤ 100。

思路与算法

1. 环形数组模拟
开辟数组 vis[n + 1] 记录淘汰状态(0 表示在圈内,1 表示已淘汰)。

2. 报数与环形绕回
使用指针 idx = (idx % n) + 1 实现首尾相接环形遍历;遇到未淘汰人员时报数计数器 count++,当 count == m 时标记淘汰并打印输出,循环直到全部淘汰。

完整程序

import java.util.ArrayList;
import java.util.List;
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();

        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }

        // 约瑟夫环模拟淘汰
        int cur = 0;
        List<Integer> outOrder = new ArrayList<>();
        while (!list.isEmpty()) {
            cur = (cur + m - 1) % list.size();
            outOrder.add(list.remove(cur));
        }

        for (int i = 0; i < outOrder.size(); i++) {
            System.out.print(outOrder.get(i) + (i + 1 < outOrder.size() ? " " : "\n"));
        }
    }
}

运行示例

输入:

5 2

输出:

2 4 1 5 3