首页 > 其他 > 详细

约瑟夫环问题

时间:2019-06-22 13:00:40      阅读:127      评论:0      收藏:0      [点我收藏+]

大家做 java 面试题应该碰到过约瑟夫环的编程题吧,本篇文章详细探讨一下这个问题。

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。算出所有人的出列顺序。

问题的几种变换形式:

  • 1、找到所有人的出列顺序?
  • 2、最后一个剩下的人事谁?
  • 3、从几号开始数,才能保证自己是最后一个出列的人?

    java 语言的数组解法

public class JosephusProblem {
    public static void main(String []args){
        //定义一个数组,数组的长度表示环的总人数,注意从0开始,n=5
        Boolean[] use=new Boolean[5];
        for (int i = 0; i < use.length; i++) {
            use[i]=true;
        }
        //数组当前剩余未出列的人数
        int leftCount=use.length;
        //计数开始的编号,m=3
        int countNum=0;
        //指引,当前开始计数的人数k=0
        int index=0;
        //剩余人数为 0 退出,如果需要知道最后一个一个退出的是谁,只需要leftCount>1
        while (leftCount>0) {
            //如果当前人未退出,则加1
            if(use[index]!=false) {
                countNum++;
                //数的到要退的人,改值为 false,同时把剩余人数减 1,计数标志置位0
                if (countNum==3) {
                    countNum=0;
                    use[index]=false;
                    System.out.println("当前出列的人是"+index);
                    leftCount--;
                }
            }
            index++;
            //如果到数字的尾部,则返回头部
            if (index==use.length) {
                index=0;
            }
        }
        for (int i = 0; i < use.length; i++) {
            System.out.println(i + "=" + use[i] + " ");
        }
    }

}

约瑟夫环问题

原文:https://www.cnblogs.com/zhangke306shdx/p/11068409.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!