有n个人编号为1~n排成一个环从1号人开始从1到m报数报到m的人离开该环从下一个人开始继续从1到m报数报到m的人离开该环这样一直进行下去直到最终剩余p个人。从键盘输入n、m、p要求n=2、m=2、pn输出最终剩余的p个初始编号。用Java编写 解题思路
解题思路:
- 首先,创建一个长度为n的布尔数组,表示每个人是否还在环中,初始值都为true。
- 创建一个变量count,表示报数的计数器,初始值为1。
- 创建一个变量index,表示当前报数的人的索引,初始值为0。
- 创建一个变量remain,表示剩余人数,初始值为n。
- 创建一个循环,循环条件为remain > p,即还剩余的人数大于p。
- 在循环中,首先判断当前报数的人是否还在环中,如果不在,则跳过该人。
- 如果当前报数的人还在环中,则判断计数器count是否等于m,如果是,则将该人从环中移除,并将remain减1,计数器count重置为1,否则,计数器count加1。
- 最后,将索引index加1,如果index等于n,则重置index为0。
- 循环结束后,输出环中剩余的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
原文地址: https://www.cveoy.top/t/topic/hHmX 著作权归作者所有。请勿转载和采集!