解题思路:

  1. 首先,创建一个长度为n的布尔数组,表示每个人是否还在环中,初始值都为true。
  2. 创建一个变量count,表示报数的计数器,初始值为1。
  3. 创建一个变量index,表示当前报数的人的索引,初始值为0。
  4. 创建一个变量remain,表示剩余人数,初始值为n。
  5. 创建一个循环,循环条件为remain > p,即还剩余的人数大于p。
  6. 在循环中,首先判断当前报数的人是否还在环中,如果不在,则跳过该人。
  7. 如果当前报数的人还在环中,则判断计数器count是否等于m,如果是,则将该人从环中移除,并将remain减1,计数器count重置为1,否则,计数器count加1。
  8. 最后,将索引index加1,如果index等于n,则重置index为0。
  9. 循环结束后,输出环中剩余的p个初始编号。

Java代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int p = scanner.nextInt();
        
        boolean[] isInCircle = new boolean[n];
        for (int i = 0; i < n; i++) {
            isInCircle[i] = true;
        }
        
        int count = 1;
        int index = 0;
        int remain = n;
        
        while (remain > p) {
            if (!isInCircle[index]) {
                index = (index + 1) % n;
                continue;
            }
            
            if (count == m) {
                isInCircle[index] = false;
                remain--;
                count = 1;
            } else {
                count++;
            }
            
            index = (index + 1) % n;
        }
        
        for (int i = 0; i < n; i++) {
            if (isInCircle[i]) {
                System.out.print((i + 1) + " ");
            }
        }
    }
}

注意:由于题目要求输出的初始编号是从1开始的,所以在输出时需要将索引加1

有n个人编号为1~n排成一个环从1号人开始从1到m报数报到m的人离开该环从下一个人开始继续从1到m报数报到m的人离开该环这样一直进行下去直到最终剩余p个人。从键盘输入n、m、p要求n=2、m=2、pn输出最终剩余的p个初始编号。用Java编写 解题思路

原文地址: https://www.cveoy.top/t/topic/hHmX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录