A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小海燕 于 2016-3-1 22:36 编辑

由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.

import java.util.Scanner;
/**
*使用数组实现约瑟夫环问题
*由m个人围成一个首尾相连的圈报数。
*从第一个人开始,从1开始报数,报到n的人出圈,
*剩下的人继续从1开始报数,直到所有的人都出圈为止。
*对于给定的m和n,求出所有人的出圈顺序.
*/
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+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++;
             }
         }
     }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马