java编程实现约瑟夫问题

约瑟夫问题:设编号为1,2,……,n(n>0)的n个人按顺时针方向围坐一个圆圈,从第1个人开始顺时针方向自1起顺序报数,报数到m为止,报数为m的人出列,然后从他的下一个人... 约瑟夫问题:设编号为1,2,……,n(n>0)的n个人按顺时针方向围坐一个圆圈,从第1个人开始顺时针方向自1起顺序报数,报数到 m 为止,报数为 m 的人出列,然后从他的下一个人开始重新报数,报数为 m 的人又出列,……,直到所有的人全部出列为止。设计算法求n个人出圈的次序。(选做) 展开
 我来答
po615fm
推荐于2017-11-26 · 超过30用户采纳过TA的回答
知道答主
回答量:70
采纳率:0%
帮助的人:57.5万
展开全部
public class RingTest{
    public static void main(String[] args){
        System.out.println("程序说明如下:");
        System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");
        
        //提示输入总人数
        System.out.println("请输入做这个游戏的总人数:");
        Scanner sca=new Scanner(System.in);
        int m=sca.nextInt();
        //提示输入要出圈的数值
        System.out.println("请输入要出圈的数值:");        
        int n=sca.nextInt();
        System.out.println("按出圈的次序输出序号:");        
        //创建有m个值的数组
        int[] a=new int[m];
        //初始长度,以后出圈一个,长度就减一
        int len=m;
        //给数组赋值
        for(int i=0;i<a.length;i++)
            a[i]=i+1;
        //i为元素下表,j代表当前要报的数
        int i=0;
        int j=1;
        while(len>0){
            if(a[i%m]>0){
                if(j%n==0){//找到要出圈的人,并把圈中人数减一
                    System.out.print(a[i%m]+"  ");
                    a[i%m]=-1;
                    j=1;
                    i++;
                    len--;
                }else{
                    i++;
                    j++;
                }
            }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
                i++;
            }
        }
    }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式