题目:有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,计算出最后一个小朋友的号码是多少。
import java.util.*;
public class t2
{
static int m = 0;
public static void main(String args[])
{
ArrayList<Integer> a = new ArrayList<Integer>();
for(int i=1;i<=500;i++)
{
a.add(i);//把每个小朋友的号码依次放入.
}
while(a.size()>1)
{
for(int i=0;i<a.size();i++)
{
m++;
if(m%3==0)
{
m = 0;
a.remove(i);
i--;
}
}
}
System.out.println("最后一个小朋友的号码是: " +a.get(0));
}
}
请问这题,哪位好心人能帮我解释下好吗?为什么while(a.size()>1) 这句要大于1呢大于2,3不行吗????在此非常的感谢
衷心感谢

解决方案 »

  1.   

    希望
    while(a.size()>1) 

    for(int i=0;i <a.size();i++) 

    m++; 
    if(m%3==0) 

    m = 0; 
    a.remove(i); 
    i--; 

    这些代码帮我解释下,我就到这里就看不懂了
      

  2.   


    import java.util.ArrayList;public class t2 {
    static int m = 0; public static void main(String args[]) {
    ArrayList<Integer> a = new ArrayList<Integer>();
    for (int i = 1; i <= 500; i++) {
    a.add(i);// 把每个小朋友的号码依次放入.
    }
    while (a.size() > 1) { //当a.size()==1就只有一个人了,也就没必要循环了,那就是最后一个了
    for (int i = 0; i < a.size(); i++) {
    m++;//相当于报数
    if (m % 3 == 0) {//数到三的人退出
    m = 0;
    a.remove(i);//退出
    i--;//删掉了当前结点,后面的结点就会前移,就是索引会-1,
    //下一轮循环该从第i个开始,也就是现在的第i+1个人就是下一轮循环的第i个人
    }
    }
    }
    System.out.println("最后一个小朋友的号码是: " + a.get(0));
    }
    }
      

  3.   

    约瑟夫环问题public class YSF {
        
    /**
     * 约瑟夫环
     * @param m  数到m退出
     * @param n  共有n个人
     * @param k  从第k个开始数
     * @return
     */
         private static int ysf(int m, int n, int k) {
            int result = 0;
            for (int i = 2; i <= n; i++) {
                result = (result + m) % i;
            }
            return result + k % n;
        }    public static void main(String[] args) {
            System.out.println(ysf(3, 500, 1));
        }
    }
      

  4.   

    面向对象的写法
    public class T {
    public static void main(String[] args) {
    Circle c = new Circle(30);// 初始化30个学生
    System.out
    .println("-------------------------检查每个child的情况-------------------------");
    c.check();
    System.out
    .println("-------------------------以下为每一次淘汰情况-------------------------");
    c.launch();
    }
    }class Child {
    private int id;
    private Child prev;
    private Child next; public int getId() {
    return id;
    } public void setId(int id) {
    this.id = id;
    } public Child getPrev() {
    return prev;
    } public void setPrev(Child prev) {
    this.prev = prev;
    } public Child getNext() {
    return next;
    } public void setNext(Child next) {
    this.next = next;
    }}class Circle {
    List<Child> children = new ArrayList<Child>(); // new Circle时初始化数据 ccount为child数量
    Circle(int ccount) {
    for (int i = 1; i <= ccount; i++) {
    Child c = new Child();
    c.setId(i);
    children.add(c);
    }
    for (int i = 0; i < children.size() - 1; i++) {
    children.get(i).setNext(children.get(i + 1));
    children.get(i + 1).setPrev(children.get(i));
    }
    children.get(children.size() - 1).setNext(children.get(0));
    children.get(0).setPrev(children.get(children.size() - 1));
    } // 检查list里的内容
    void check() {
    for (int i = 0; i < children.size(); i++) {
    Child c = children.get(i);
    System.out.println(c.getId() + "号的前一个是" + c.getPrev().getId()
    + "号,后一个是" + c.getNext().getId() + "号");
    }
    } // 执行任务
    void launch() {
    Child c = children.get(0);
    int count = 0;
    while (children.size() > 1) {
    count++;
    if (count == 3) { //数到3时修改指针 移除数据
    c.getPrev().setNext(c.getNext());
    c.getNext().setPrev(c.getPrev());
    children.remove(c);
    count = 0; // 打印每一次的情况
    for (Child child : children) {
    System.out.print(child.getId() + " ");
    }
    System.out.println();
    }
    c = c.getNext();
    }
    System.out.println("最后剩下的child的id为: " + children.get(0).getId());
    }
    }
      

  5.   

    import java.util.ArrayList;public class t2 {
           public static void main(String args[]) {
            ArrayList<Integer> a = new ArrayList<Integer>();
            for (int i = 1; i <= 500; i++) {
                a.add(i);// 把每个小朋友的号码依次放入.
            }
            while (a.size() > 1) { //当a.size()==1就只有一个人了,也就没必要循环了,那就是最后一个了        
                for (int i = 0; i < a.size(); i++) {
                    m++;//相当于报数
                    if (m % 3 == 0) {//数到三的人退出
                        m = 0;
                        a.remove(i);//退出
                        i--;//删掉了当前结点,后面的结点就会前移,就是索引会-1,
                            //下一轮循环该从第i个开始,也就是现在的第i+1个人就是下一轮循环的第i个人
                    }
                }
            }
            System.out.println("最后一个小朋友的号码是: " + a.get(0));
        }
    }