用数据结构的方法编写java代码,实现约瑟夫环问题:n个人围成一圈,从第一个人开始报数,报到m的人出列;再由下一个人重新从1开始报数,报到m的人再出列;依此类推,直到最后一个人出列,输出每次出列的人的编号。
时间: 2024-03-10 11:23:40 浏览: 72
好的,我知道你的要求了。下面是Java代码实现:
```
import java.util.LinkedList;
import java.util.Scanner;
public class JosephusProblem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入总人数n:");
int n = scanner.nextInt();
System.out.print("请输入报数的数字m:");
int m = scanner.nextInt();
LinkedList<Integer> list = new LinkedList<>();
for (int i = 1; i <= n; i++) {
list.add(i);
}
int count = 1;
while (list.size() > 0) {
int index = count % list.size();
if (index == 0) {
index = list.size();
}
int num = list.remove(index - 1);
System.out.print(num + " ");
if (count % m == 0 || count == list.size()) {
System.out.println();
}
count++;
}
}
}
```
程序要求用户输入总人数n和报数的数字m,然后使用LinkedList数据结构存储n个人的编号。在程序执行过程中,使用count来表示当前轮次数,并且使用count % list.size() 来计算当前轮要出列的人的下标,其中 % 表示取余数运算符,表示count除以list.size()的余数。如果当前轮要出列的人的下标是0,就将其改为list.size(),因为LinkedList的下标是从0开始计数的。
在删除下标为index-1的元素后,使用System.out.print(num + " ") 输出出列的人的编号,并检查是否需要输出换行符,如果当前轮数count是m的倍数或者已经输出完最后一个人的编号了,就输出换行符。最后,程序结束。
对于输入样例n=10,m=3,程序的输出如下:
```
请输入总人数n:10
请输入报数的数字m:3
3 6 9 2 7 1 8 5 10
4
```
阅读全文