栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java编程实践|约瑟夫出圈问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java编程实践|约瑟夫出圈问题

Java编程实践|约瑟夫出圈问题

问题描述流程思路文字思路实现代码运行结果说明

问题描述

用数组实现约瑟夫出圈问题由m个人围成一个首尾相连的圈报数,从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止(剩余人数为1结束报数)给定m和n,求出所有人的出圈顺序 流程思路 文字思路

“从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数”,可以看出这有个循环,当只剩一人时,则循环结束。找到报n这个数的人就是要进行取余操作,判定标志为取余的结果为0找到后,将当前位置的数组元素置为-1,表示出圈,然后下一个数组元素继续从1开始报数分析到这里,已经可以写出代码了但是,继续分析一下,你是用-1表示它出圈,后面再循环过来就会碰到已经出圈的位置,就要在取余前再加一个判定当前数组元素是否为负,为负则继续向前为什么要a[i%m]?这是因为这是个循环报数,数组元素只有6个,用i来遍历,循环一遍后i肯定会大于6,所以采用这种方式。以下图为例,a[7%6]=a[1],这样子来保证表示的数组元素是同一个

实现代码
import java.util.Scanner;


public class JosephRing {
    public static void main(String[] args){

        System.out.println("请输入这个游戏的总人数:");
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();

        System.out.println("请输入要出圈的数值:");
        int n = scanner.nextInt();

        int[] a = new int[m];
        int len = m;//用于表示剩余人数

        //给每个人赋初值,即第一次报数
        for(int i=0;i=1){//是否还有人
            if(a[i%m]>0){		//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{
                i++;
            }
        }

    }
}
运行结果
请输入这个游戏的总人数:
6
请输入要出圈的数值:
5
出圈次序:1 2 3 4 5 6 
人员位置:5 4 6 2 3 1 
说明

这个题目我没有找到标准题干和答案,最后面的格式控制我是想表达清楚,因为可能有点绕,但还有瑕疵,但是我不想改了,建议测试用例用10以下的数值看的清楚些!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/732318.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号