问题描述流程思路文字思路实现代码运行结果说明
问题描述用数组实现约瑟夫出圈问题由m个人围成一个首尾相连的圈报数,从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止(剩余人数为1结束报数)给定m和n,求出所有人的出圈顺序 流程思路 文字思路
“从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数”,可以看出这有个循环,当只剩一人时,则循环结束。找到报n这个数的人就是要进行取余操作,判定标志为取余的结果为0找到后,将当前位置的数组元素置为-1,表示出圈,然后下一个数组元素继续从1开始报数分析到这里,已经可以写出代码了但是,继续分析一下,你是用-1表示它出圈,后面再循环过来就会碰到已经出圈的位置,就要在取余前再加一个判定当前数组元素是否为负,为负则继续向前为什么要a[i%m]?这是因为这是个循环报数,数组元素只有6个,用i来遍历,循环一遍后i肯定会大于6,所以采用这种方式。以下图为例,a[7%6]=a[1],这样子来保证表示的数组元素是同一个
实现代码import java.util.Scanner;
public class JosephRing {
public static void main(String[] args){
System.out.println("请输入这个游戏的总人数:");
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
System.out.println("请输入要出圈的数值:");
int n = scanner.nextInt();
int[] a = new int[m];
int len = m;//用于表示剩余人数
//给每个人赋初值,即第一次报数
for(int i=0;i=1){//是否还有人
if(a[i%m]>0){ //a[i%m]使得多次循环后表示同一位置元素,>0判定当前位置元素是否已经出圈
if(j%n==0){
System.out.print(a[i%m]+" ");
a[i%m]=-1;
j=1;i++;len--;
}
else {
i++;j++;
}
}
else{
i++;
}
}
}
}
运行结果
请输入这个游戏的总人数: 6 请输入要出圈的数值: 5 出圈次序:1 2 3 4 5 6 人员位置:5 4 6 2 3 1说明
这个题目我没有找到标准题干和答案,最后面的格式控制我是想表达清楚,因为可能有点绕,但还有瑕疵,但是我不想改了,建议测试用例用10以下的数值看的清楚些!



