Java 实现约瑟夫环问题:代码详解和示例
Java 实现约瑟夫环问题:代码详解和示例
约瑟夫环问题是一个经典的算法问题,描述了 n 个人围成一圈,从第 1 个人开始报数,报到 m 的人出局,然后继续从下一个开始报数,直到最后剩下 p 个人。
本文将用 Java 实现约瑟夫环问题,并提供详细的代码解释和示例。
代码实现
import java.util.ArrayList;
import java.util.List;
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();
System.out.print("请输入剩余人数p:");
int p = scanner.nextInt();
List<Integer> people = new ArrayList<>();
for (int i = 1; i <= n; i++) {
people.add(i);
}
int count = 0;
int index = 0;
while (people.size() > p) {
count++;
if (count == m) {
people.remove(index);
count = 0;
} else {
index++;
}
if (index == people.size()) {
index = 0;
}
}
System.out.print("最终剩余的' + p + '个初始编号为:");
for (int i = 0; i < people.size(); i++) {
if (i != people.size() - 1) {
System.out.print(people.get(i) + "和");
} else {
System.out.println(people.get(i));
}
}
}
}
代码解释
-
输入参数: 代码首先使用
Scanner从键盘输入总人数n、报数m和剩余人数p。 -
初始化: 创建一个
ArrayList存储所有人的初始编号,从 1 到n。 -
循环模拟: 使用
while循环模拟报数过程,直到剩余人数为p。- 使用
count变量记录当前报数。 - 使用
index变量记录当前报数的人的位置。 - 当
count等于m时,表示当前的人出局,使用remove方法将其从people列表中移除,并重置count为 0。 - 否则,将
index加 1,指向下一个报数的人。 - 如果
index超过了列表长度,则将其重置为 0。
- 使用
-
输出结果: 最后,循环遍历
people列表,输出最终剩余的 p 个初始编号。
示例
例如,输入 n、m、p 分别为 4、3、2,则输出为 1 和 4。
总结
本文详细讲解了用 Java 实现约瑟夫环问题的步骤,并提供了完整代码示例。通过输入人数、报数和剩余人数,程序将输出最终剩余的编号。你可以运行这段代码,并根据提示输入 n、m 和 p 的值,程序将输出最终剩余的 p 个初始编号。
原文地址: https://www.cveoy.top/t/topic/o57w 著作权归作者所有。请勿转载和采集!