高俊 发表于 2015-12-14 21:31

约瑟夫环


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;
      //初始长度,以后出圈一个,长度就减一
      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>0){
                if(j%n==0){//找到要出圈的人,并把圈中人数减一
                  System.out.print(a+"");
                  a=-1;
                  j=1;
                  i++;
                  len--;
                }else{
                  i++;
                  j++;
                }
            }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
                i++;
            }
      }
    }
}


java宫城大师 发表于 2016-3-17 22:08

学习一下。谢谢:victory:

woniu 发表于 2016-4-12 11:39

这个项目太棒勒!下下来学习下!

幕后摆手 发表于 2016-11-1 15:48

若m个人以1到m编号,剩余人数为i;当n<=m时,首先是n至m号的人先出圈;n>i,每轮第n%i个人出圈。
n>i的情况下:
n除以i的商为1时,从n%i对应的序号开始每隔一位的序号出圈(n%i, n%i + 2,...,[末位序号或末位序号-1])
n除以i的商为2时,出圈顺序同上规律...
int i = m;
List<Integer> baselist = new ArrayList<>();
int[] res = new int;
for(int j = 0;j < m;j++)
        baselist.add(j+1);
for(;i >= n;i--){
        res = m + n - i;
        baselist.remove((Integer)(m + n - i));
}
while(i > 0){
        for(int j = n%i==0? i-1: n%i -1;j < baselist.size();j++){
                res = baselist.get(j);
                baselist.remove(j);
        }
}
数组res为所求

缘丨妙不可言 发表于 2017-12-20 18:33

1111111111111
页: [1]
查看完整版本: 约瑟夫环