1.问题
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
2.解决方法一:循环数组
提示:每次报数,如果满足出圈的条件就将数组元素设置为-1,当下次报数时跳过-1。直至数组最后一个元素变为-1,循环结束,数组的循环使用取模来完成。
解决
//解决方法二:数组+取模
public static void JosephuByArr(int total,int startNum,int m){
int []Arr=new int[total];
int leave=total; //剩下的数量
int count=0; //报数(0-1-2-3-4-5····)
int index=startNum; //第一个元素
//初始化数组(为了方便取模,最后一个元素放在数组的第0个,也可以先加一再取模)
Arr[0]=total;
for(int i=1;i<Arr.length;i++){
Arr[i]=i;
}
while(leave>0){
count++; //报数
//找到报数为count的数组