java逻辑题 急,麻烦大家了

susuyjh 2009-10-25 05:15:29

题目:有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不行吗????在此非常的感谢
衷心感谢
...全文
407 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
典型的约瑟夫环问题
cuiqunhao 2009-10-25
  • 打赏
  • 举报
回复
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));
}
}
lz12366007 2009-10-25
  • 打赏
  • 举报
回复
很强大。。。收藏了。。。。
haojia0716 2009-10-25
  • 打赏
  • 举报
回复
面向对象的写法


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());
}
}


swandragon 2009-10-25
  • 打赏
  • 举报
回复
约瑟夫环问题

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));
}
}
knightzhuwei 2009-10-25
  • 打赏
  • 举报
回复
猴子选大王真的好普遍啊
cooler4k 2009-10-25
  • 打赏
  • 举报
回复

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));
}
}
susuyjh 2009-10-25
  • 打赏
  • 举报
回复
希望
while(a.size()>1)
{
for(int i=0;i <a.size();i++)
{
m++;
if(m%3==0)
{
m = 0;
a.remove(i);
i--;
}
这些代码帮我解释下,我就到这里就看不懂了

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧