设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1-M报数,报数到第M的人,此人出圈,在从他的下一个人重新开始从1-M报数,如此进行下去,每次报数到M的人就出圈,直到所有人都出圈为止。给出这N个人的出去按顺序。
package exercise; // 约瑟夫环问题 public class Joseph_le { public static void main(String[] args) { // TODO 自动生成的方法存根 final int N = 13,S = 3,M = 5; int i = S - 1,j,k = N,g = 1; int [] cot = new int[N]; for(int h = 1;h <= N;h++) { cot[h - 1] = h;// 将编号为h的人存入下标为h-1的数组元素中 } System.out.println(" 出圈的顺序为:"); do { i = i+ (M - 1);//计算出圈人的下标i while(i >= k)//当数组下标i大于等于圈中的人数k时 i = i - k;//当数组的下标i减去圈中的人数k System.out.print(" " + cot[i]); for(j = i;j < k-1;j++) cot[j] = cot[j + 1];//cot[i]出圈后,将后续人的编号前移 k--;//圈中的人数k减1 g++;//g为循环控制变量 }while(g <= N);//共有N人所以循环N次 } }
程序运行结果如下:
出圈的顺序为:
7 12 4 10 3 11 6 2 1 5 9 13 8