问题描述:
有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,打印输出依次退出小朋友的编号?
List集合实现
import java.util.LinkedList;
import java.util.List;
public class JosephusList {
static int m = 0,n=0;
public static void main(String[] args) {
List<Integer> list = new LinkedList<Integer>();
for (int i = 1; i <= 500; i++) {
list.add(i);
}
while (list.size() >0) {
for (int i = 0; i < list.size(); i++) {
m++;
if (m % 3 == 0) {
m = 0;
n++;
System.out.print(list.get(i)+"\t");
if (n%10==0) System.out.println(); //每10个编号为一行输出
list.remove(i);
i--;
}
}
}
}
}
数组实现
public class JosephusArray {
public static void main(String[] args) {
int[] children = new int[500];
for(int i=0;i<500;i++){
children[i]=i+1; //小朋友站圈并编号
}
int num=0,m=0;
while(true){
if (num==500){
break;
}
for(int i=0;i<500;i++){
if(children[i]!=0){
m++;
if(m==3){
System.out.println(children[i]); //退出小朋友的编号
children[i]=0; //退出后编程置为0
m=0;
num++;
}
}
}
}
}
}
队列实现
import java.util.ArrayDeque;
import java.util.Deque;
public class JosephusQueue {
public static void main(String args[]) {
int a[] = new int[500];
for (int i = 0; i < 500; i++) {
a[i] = i + 1;
}
// 使用队列求解约瑟夫环
Deque<Integer> deque = new ArrayDeque<Integer>();
for (int i = 0; i < a.length; i++) {
deque.add(a[i]);// 全体入列
}
int count = 1;
while (deque.size() > 1) {
int number = deque.pollFirst(); // 出列操作
if (count != 3)
deque.offerLast(number); // c重新入列
else {
System.out.println("出圈号码:" + number);
}
if (count == 3)
count = 0;
count++;
}
System.out.println("剩下的人的号码是:" + deque.peek());
}
}
自定义链表实现
public class JosephusMyList {
static Child c1;
public static void main(String[] args) {
c1 = new Child(1);
appendChild(c1,2);// 小朋友站圈
int n=1;
Child p=c1;
Child previous;
while(p.getNext()!=p)
{
previous= p;
p=p.getNext();
n++;
if (n % 3==0){
System.out.println(p.getNum());
previous.setNext(p.getNext());
p=previous;
}
}
System.out.println(p.getNum());
}
static void appendChild(Child c ,int num){
if (num==501){
c.setNext(c1);
return;
}
Child next = new Child(num);
c.setNext(next);
appendChild(next,num+1);
}
}
//定义小朋友类
class Child{
Child next;
int num;
public Child(int num){
this.num = num;
}
public Child getNext() {
return next;
}
public void setNext(Child next) {
this.next = next;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}