题目:假如有50个人列队站成一列。然后第一个人开始报数。依次为1,2,3,4......50。然后报数为3的倍数的人出列。剩下的人重新从1,2,3.....报数,报数为3的倍数的人出列。剩下的人重新报数。依次类推。问题:用java实现最后一个出列的人是原来50人中的第几个人(即第一次报数的数字)

解决方案 »

  1.   

    约瑟夫环...帮你找一个
    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]=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++;
                }
            }
        }
    }看原文点这里
      

  2.   


    import java.util.Scanner;
    import java.util.Vector;
    public class Count3Quit1 {
    public static void main(String[] args) {
    System.out.println("请输入参加游戏的总人数:");
    Scanner sca=new Scanner(System.in);
             int n=sca.nextInt();
    int[] a = new int[n];
    for(int i=0; i<a.length; i++) {
    a[i] = 1;
    }

    int leftCount = a.length;   
    int countNum = 0;
    int index = 0;

    while(leftCount != 1) {
    if(a[index] == 1) {
    countNum ++;
    if(countNum == 3) {
    countNum = 0;
    a[index] = 0;
    leftCount --;
    }
    }

    index ++;
    if(index == a.length) {
    index = 0;
    }
    }

    for(int i=0; i<a.length; i++) {
    if(a[i] == 1) {
    System.out.println("最后剩下的人是"+i+"号!");
    }
    }
    }

    }
      

  3.   

    这里还有个以前写的面向对象设计的程序,看起来罗嗦了一点,楼主有时间就看一下吧...import java.util.Scanner;public class Count3Quit{
     public static void main(String[] args){
    System.out.println("请输入参加游戏的总人数:");
    Scanner sca=new Scanner(System.in);
            int m=sca.nextInt();   KidCircle kc=new KidCircle(m);
      Kid k=kc.first;                         // 定义一个小孩对象k为这个圈的第一个人
      int countNum=0;                         //定义一个变量统计数字
      while(kc.count>1){
      countNum++;
      if(countNum==3){
      countNum=0;
      kc.delete(k);
      }
      k=k.right;
      }
      System.out.println("剩下的那个小孩的id号是:   "+kc.first.id);
      }
    }class Kid{
    int id; //小孩编号
    Kid left,right;          //小孩的左右手

    public Kid(){
    }
    }

    class KidCircle{
      int count=0;           //小孩个数
      Kid first,last;
           
      KidCircle(int n){ 
       for(int i=0;i<n;i++)
       add();                   //构造一个方法,把n个小孩构成一个圈
      
      }
      
      void add(){          //往圈里添加小孩
       Kid k=new Kid();
       k.id=count;
      
       if(count<=0){
        first=k;
        last=k;
        k.left=k;
        k.right=k;
      }else{
       last.right=k;
       k.right=first;
       k.left=last;
       first.left=k;
       last=k;
       }
       count++;
      }
      
      void delete(Kid k){      //小孩删除方法
      
       if(count<=0){
       return;
       }else if(count==1){
       first=last=null;
       }else{
       k.left.right=k.right;
       k.right.left=k.left;
      
       if(k==first){
       first=k.right;
       }else if(k==last){
       last=k.left;
       }
       }
       count--;
       }
      
    }
      

  4.   


    import java.util.ArrayList;
    import java.util.List;
    public class Test {
     /**
      * @param args
      */
     public static void main(String[] args) {
      Test test = new Test();
      System.out.println("最后一个出列的人是"+test.getResult(50,3)); }
     
     private int getResult(int n,int m){  
      List<Integer> list = new ArrayList<Integer>(n);
      List<Integer> list2 = new ArrayList<Integer>();
      List<Integer> list3 = new ArrayList<Integer>();
      for(int i = 1; i <= n; i++){
         list.add(i);
      }
      while(list.size() >= m){
            for(int i = 0; i < list.size(); i++){
               if((i+1) % m == 0){
                  list3.add(list.get(i));
                  list2.add(list.get(i));
               }
          }
           list.removeAll(list2);
      }  return list3.get(list3.size()-1);
     }
    }
      

  5.   

    其实四楼和五楼差不多,只是五楼直接用了api里面提供的而已四楼是自己定义的链表。