问题描述流程思路文字思路实现代码运行结果说明 问题描述
用数组实现约瑟夫出圈问题由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以下的数值看的清楚些!