有N个孩子围成一圈,从第一个孩子开始顺时针报数,报到3的孩子出列,下一个孩子有从一开始报数直到剩下最后一个孩子为止,试写一个程序,能让用户输入N,在输出最后剩下的孩子是第几号。例如5个孩子剩下的是4号。6个孩子剩下的是1号。请有java写。

解决方案 »

  1.   

    嗯,就是一个老算法,但是该怎么写最简单?
    求代码!java的。
      

  2.   


    package collections;import java.util.*;public class Children {
    private int cnt;  //小孩人数
    private int number;  //用于计数

        public Children(int cnt){
         this.cnt = cnt;
        }
        
        public void choice(){
         ArrayList<Integer> children = new ArrayList<Integer>();
         for(int i=1;i<=cnt;i++){     //初始化
         children.add(i);
         }
         Iterator<Integer> it = children.iterator();
         while(cnt>1){
         if(it.hasNext()){
         it.next();   //往后读
         number++;
         }else{
         it = children.iterator();   //迭代器到达末尾后,重置到链表头部。模拟一个环。
         }
         if(number==3){    //报到的孩子出列
         number = 0 ;
         it.remove();
         cnt--;
         }
         }
         System.out.println(children.get(0));    //最后剩下一个
        }
        
        public static void main(String[] args) {
         int N = 6 ; 
    new Children(N).choice();
    }
    }
      

  3.   

    前两天刚刚有网友发过类似的帖,
    http://topic.csdn.net/u/20110327/22/b7ca7bcc-11c9-45ff-b050-5b358d9b18d0.html
    这个帖应该能帮到你吧!
      

  4.   


    public static int getLastone(int total, int step) {
    int r = 0;
    for (int i = 2; i <= total; i++)
    r = (r + step) % i;
    return r;
    }
      

  5.   

    public class Count3Quit {
    public static void main(String[] args){
    boolean[] arr =new boolean[500];
    for(int i = 0; i < arr.length; i ++){
    arr[i] = true;
    }
    int leftCount = arr.length;
    int countNum = 0;
    int index = 0;
    while(leftCount > 1){
    if(arr[index] == true){
    countNum ++;
    if(countNum == 3){
    countNum = 0;
    arr[index] = false;
    leftCount --;
    }
    }

    index ++;
    if(index == arr.length){
    index = 0;
    }
    }
    for(int i = 0; i<arr.length; i ++){
    if(arr[i] == true){
    System.out.print(i);
    }
    }
    }}
    你看看这个行不嘛 网上看见的
      

  6.   

    public void test(int n)
    {
       Vector a = new Vector();
       for(int i=1; i<=n; i++)
       {
            a.add("第" + i + "个孩子");
       }
       for(;;)
       {
            if(a.size()==1) break;
            for(int k=0; k<2; k++)
            {
               a.add(a.remove(0));
            }
            a.remove(0);
       }
       System.out.println(a);}    
      

  7.   

    这个也不错。不是第三个的全加在vector后面。到第三的倍数的就移出去。知道剩下一个。也是模拟一个环。
      

  8.   


    int GetLastNumber(int n, int m)
    {
    int *pArr = new int[n];
    int i = 0;
    for (i = 0; i < n; i++)
    pArr[i] = i + 1;
    int j = 0, k = -1;
    for (i = 0; i < n;)
    {
    if (pArr[i] > 0)
    {
    j++;
    if (j == m)
    {
    pArr[i] = 0;
    j = 0;

                            }
    if (k == i)
    break;
    k = i;
    }
    if (i == n - 1)
    i = 0;
    else
    i++;
    }
    if (pArr != NULL)
    {
    delete []pArr;
    pArr = NULL;
    }
    return i;
    }