题目:有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不行吗????在此非常的感谢
衷心感谢
while(a.size()>1)
{
for(int i=0;i <a.size();i++)
{
m++;
if(m%3==0)
{
m = 0;
a.remove(i);
i--;
}
这些代码帮我解释下,我就到这里就看不懂了
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));
}
}
/**
* 约瑟夫环
* @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));
}
}
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());
}
}
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));
}
}