java问题:500个孩子围成圈,从第一个开始报数,逢3退出,然后从下一个孩子继续开始报数,直到只剩下一个

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java问题:500个孩子围成圈,从第一个开始报数,逢3退出,然后从下一个孩子继续开始报数,直到只剩下一个相关的知识,希望对你有一定的参考价值。

问最后剩下的那个孩子所在的初始位置并打印输出,最好能用数组实现,谢谢

逢3退出,我的理解是数字中带3的, 3 13 23 30-39这些都是.
看了一下约瑟夫环,说的是 3的倍数.所以做了,两个判断方法.
isMod3
isMeet3

从实现上来说,用list这样的集合方便一些.数组不具有删除相应元素的能力,只能写方法来处理.
fun1 - list
fun2 - 用一个自定义对象数组
fun3 - 用int[]数组来处理.

你看一下吧.希望对你有帮助.
---------------------------------------------------------------------------------------------------------------------

import java.util.ArrayList;
import java.util.List;

public class Test1

public static void main(String[] args) throws Exception
new Test1().fun1();
new Test1().fun2();
new Test1().fun3();


public void fun1()
List listUser = new ArrayList();
for (int i = 1; i <= 500; i++)
listUser.add(i);

int index = 0;
int count = 1;
while (listUser.size() > 1)
// if (isMod3(count++))
if (isMeet3(count++))
listUser.remove(index);
index--;

if (listUser.size() == ++index)
index = 0;


System.out.println(listUser.get(0));


// 例3,6,9
public boolean isMod3(int x)
return x % 3 == 0;


// 例3,13,23,30,31....
public boolean isMeet3(int x)
boolean result = false;
while (x > 0)
if (x % 10 == 3)
result = true;
break;

x = x / 10;

return result;


public void fun2()
User[] users = new User[500];
for (int i = 0; i < users.length; i++)
users[i] = new User();
users[i].no = i + 1;

int index = 0;
int meet = 1;
int count = 0;
while (users.length - count > 1)
if (index == users.length)
index = 0;

if (users[index].isDelete)
index++;
continue;

if (isMeet3(meet))
count++;
users[index].isDelete = true;

meet++;
index++;


for (int i = 0; i < users.length; i++)
if (!users[i].isDelete)
System.out.println(users[i].no);




class User
int no = 0;
boolean isDelete = false;


public void fun3()
int[] users = new int[500];
for (int i = 0; i < users.length; i++)
users[i] = i + 1;


int index = 0;
int count = 1;

while (users.length > 1)
if (isMeet3(count++))
users = arrayRemoveIndex(users, index);
index--;

if (users.length == ++index)
index = 0;


System.out.println(users[0]);


public int[] arrayRemoveIndex(int[] array, int index)
int[] newArray = new int[array.length - 1];
int arrayIndex = 0;
for (int i = 0; i < array.length; i++)
if (i == index)
continue;

newArray[arrayIndex++] = array[i];

return newArray;

参考技术A 用栈吧,数组不能把退出的孩子删除 参考技术B 这个经典编程问题。每年几十万人都写这个题
搜索“约瑟夫环”,答案有几万套。不用人替你再写了。

以上是关于java问题:500个孩子围成圈,从第一个开始报数,逢3退出,然后从下一个孩子继续开始报数,直到只剩下一个的主要内容,如果未能解决你的问题,请参考以下文章

JAVA围圈报数 问题

java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人

java解答:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?

C++ 结构有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,(用结构)

有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位