题目:有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,计算出最 后一个小朋友的号码是多少?
求各路大神帮忙,最好能给出题目的思路和源代码及解析,万分感激!

解决方案 »

  1.   

    http://topic.csdn.net/u/20120627/20/4f300b35-b616-4d3d-8a22-e5313f9fc3cb.html
      

  2.   

    public class Count3Quit {
    public static void main(String[] args) {
    boolean[] arr = new boolean[500];                  //定义500个人
    for(int i=0; i<arr.length; i++) {
    arr[i] = true;                //假设人还在为true,退出为false。
    }

    int leftCount = arr.length;                         //剩余人数
    int countNum = 0;                                   //数(1\2\3) int index = 0;                                              //当前位置

    while(leftCount > 1) {                            
      //循环,知道只剩1个true为止
    if(arr[index] == true) {
    countNum ++;
    if(countNum == 3) {                           
     //数到3,改false
    countNum = 0;
    arr[index] = false;
    leftCount --;
    }
    }

    index ++;

    if(index > arr.length-1) {        //当过了最后1人时,从头开始数
    index = 0;
    }
    }

    for(int i=0; i<arr.length; i++) {
      if(arr[i] == true) {
    System.out.println(i);                          
    }
    }
    }
    }
      

  3.   


    import java.util.*;
    public class test1 {
        public static void main(String[] args) throws Throwable {
            List<Integer> list = new LinkedList<Integer>();
            for (int i=1; i<=500; i++) {
             list.add(i);//500个小朋友放到链表里
             } 
            int index = 0, num = 0;
            while (list.size() > 1) { //如果人数大于1
                num++; //数数
                if (num%3 == 0) { //如果数到3
                    System.out.println(list.remove(index)); //从链表删除
                    num = 0; //重新数数
                } else { //没数到3
                    index++; //位置前移
                }
                if (index==list.size()) { //如果位置移到最后
                    
                    index = 0; //位置重新回到开头
                }
                
            }        System.out.println(list.get(0)); //打印最后一个
        }
    }
    是不是这样写?但我还是不明白,题目不是叫我找出最后一个退出的小朋友吗?我是这样理解题目的:从第一个小朋友开始,循环报数1,2,3报到3的就退出,那退出的小朋友的号码应该是3,6,9.....这样的顺寻依次下去,所以最后一个退出的小朋友应该是接近500的那个小朋友啊!是不是我理解题目错误了?
      

  4.   

    我那个不是无限循环报数,淘汰到最后1个人 然后打印那个人的编号。我记得尚学堂JAVA教程里有讲这么一道题
      

  5.   

    帮你看了下,在(尚学堂科技_java视频教程__第05章_数组)09_练习_7      20分钟的时候开始讲你说的这道题。你可以去下个视频看下