Josephu问题为:设编号为1,2,3……n的n个人围坐一圈,
约定编号为k(1<=k<=n)的人从1开始报数,到m的那个人出列,
它的下一位又从1开始报数,数到m的人又出列。以此类推,直到所有人出列为止,由此产生一个出对编号的序列。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*3. Josephu问题为:设编号为1,2,3……n的n个人围坐一圈,
约定编号为k(1<=k<=n)的人从1开始报数,到m的那个人出列,
它的下一位又从1开始报数,数到m的人又出列。以此类推,直到所有人出列为止,由此产生一个出对编号的序列。*/
public class Josephu {
// 1.使用list表进行存储n个人
// 2.输入集合长度n,开始报数的人编号k,出列值m
public static void outmember(int n, int k, int m) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
list.add(i);
}
System.out.println("开始时人们排序如下:");
for (Integer integer : list) {
System.out.printf("%-3s", integer);
}
System.out.println();
//根据开始报数编号与出列数求出出列下标
int count = (k + m - 2) % list.size();
while (list.size() != 0) {
// 获取出列人的下标
System.out.println("出列人为:" + list.get(count));
list.remove(count);
if (list.size() != 0) {
count = (count + m - 1) % list.size();
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("是否要开始,输入0结束");
int d;
while ((d = scanner.nextInt()) != 0) {
System.out.println("请输入集合长度n,开始报数的人编号k,出列值m,(k<n):");
int n = scanner.nextInt();
int k = scanner.nextInt();
int m = scanner.nextInt();
outmember(n, k, m);
System.out.println("是否要开始,输入0结束");
}
}
}