" 约瑟夫环"问题
设有N个人围做在一圈并按顺时针方向从1到N编号,从第S人开始从1到M报数,报数到第M的人,此人出圈,再从他的下一个人重新开始从1到 M报数,如此进行下去,每次报到M的人就出圈,直到所有人都出圈为止。求这N个 人的出圈顺序。
public class App3_2 {
public static void main(String[] args) {
int N=13,S=3,M=5;
int i=S-1;
int g=0;
int[] a=new int[N];
for(int n=0;n<13;n++) {
a[n]=n+1;
}
do {
i=i+M-1;
while(i>=N) {
i=i-N;
}
System.out.print(a[i]+" ");
for(int j=i;j<N-1;j++)
a[j]=a[j+1];
N–;
g++;
}while(g<=13);
}
}
注:我认为本题的关键是要想到利用数组,将每个人的编号都放入数组中,就方便了输出。
其次还有注意两点,一是当一个人出圈后,后面人的下标要向前进一位,二是要注意下标的范围,数组的长度不能超过剩余的人数。