用循环链表实现:n个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法。于是n个人围成一圈(从A,B,C...分别编号)。从编号为A的人开始,依次报数,数到第distance个人,便把他投入大海中,然后再从他的下一个人数起,数到第distance人,再将他扔到大海中,如此循环地进行,直到剩下k个乘客为止。按顺序依次输出被扔下大海的乘客的编号。
设计一个程序(Java语言实现)求出出列顺序。
输入格式:输入为3个正整数,分别表示n、distance、k,均不超过26
输出格式:输出为一行整数,为出列人的编号。每个整数后一个空格。
第一步,创建n个乘客,n > 0;从start开始计算,0 < start < n;每次数到distance的人出局,0 < distance < n。创建一个ArrayList数组来存放乘客,然后遍历数组输出, 代码如下所示:
if (n <= 0 || start <= 0 || start >= n || distance <= 0 || distance >= n ){
System.out.println("参数无效!!!请重新输入!!!");
}else{
ArrayList<String> list = new ArrayList<>(n);
System.out.print("编号为:");
for (int i = 0; i < n; i++) {
list.add((i + 1) + " ");
}
System.out.println(list);
第二步,创建一个while循环,来进行Josephus环方式计数,start的值等于start加上distance-1在求余得到,为什么要减一呢,是因为从start值计起,代码如下所示:
while (n > 1){
start = (start + distance - 1 ) % n;
System.out.println("删除的编号为:" + list.remove(start) + " " + list);
n--;
}
System.out.println("最后剩下的编号为:" + list.get(0));
完整代码如下所示:
import java.util.ArrayList;
public class Jt {
public Jt(int n, int start, int distance){
if (n <= 0 || start <= 0 || start >= n || distance <= 0 || distance >= n ){
System.out.println("参数无效!!!请重新输入!!!");
}else{
ArrayList<String> list = new ArrayList<>(n);
System.out.print("编号为:");
for (int i = 0; i < n; i++) {
list.add((i + 1) + " ");
}
System.out.println(list);
while (n > 1){
start = (start + distance - 1 ) % n;
System.out.println("删除的编号为:" + list.remove(start) + " " + list);
n--;
}
System.out.println("最后剩下的编号为:" + list.get(0));
}
}
public static void main(String[] args) {
new Jt(6,3,5);
}
}
效果图如下图所示: