P1996 约瑟夫问题

题目描述

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. 这道题用集合来写会更简单一点,先把 1 ~ n 放进一个 ArrayList 集合中,将它们按顺序编号
  2. 再定义一个指针变量,表示出圈人的下标,初始化为零。每次都要加上 m 得出需要出圈人的下标(需要%集合内元素的个数,防止越界),找了之后把它打印出来后再通过 remove 方法移除需要出圈的元素
  3. 直到集合内没有元素时就退出循环

代码 

 

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);  //移除出圈的元素,集合内的元素会自动填补空缺
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值