Java程序设计基础 数组 练习2 约瑟夫环问题

设有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("\n出圈的顺序为:");
        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

 

posted @ 2017-04-10 19:07  茕茕白兔  阅读(316)  评论(0编辑  收藏  举报