import java.util.ArrayList;
import java.util.LinkedList;
/**
* 有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。
* 现在给定一个数N,从第一个人开始依次报数,数到N的人出列,
* 然后又从下一个人开始又从1开始依次报数,
* 数到N的人又出列...如此循环,直到最后所有人出列为止。
* 输出出列轨迹
*
*/
public class Josephus3{
//存放
LinkedList<String> jList=new LinkedList<String>();
ArrayList<String> temp=new ArrayList<>();
public Josephus3(int i){
for(int j=1;j<=i;j++)
jList.add(j+"");
}
public void go(int start,int n){
int size=jList.size();
if(size==0){
System.out.println("结束");
return;}
for(int i=1;i<=size;i++){
if((start+i)%n==0){
System.out.println(jList.get(i-1)+"out");
temp.add(jList.get(i-1));
}
}
for(String str:temp)
jList.remove(str);
temp.clear();;
go((start+size)%n,n);
}
public static void main(String[] args){
// long t1=System.currentTimeMillis();
Josephus3 josephus3=new Josephus3(10);
josephus3.go(0, 3);
// System.out.print("花费时间:");
//System.out.println(System.currentTimeMillis()-t1);
}
}
import java.util.Scanner;
public class Josephus2{
public static void main(String[] args){
System.out.println("请输入总人数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();
System.out.println("请输入出圈数:");
int n=sca.nextInt();
System.out.println("以下是出列的次序:");
//创建有m个值的数组
int[] a=new int[m];
//初始长度,以后出圈一个,长度就减一
int len=m;
//给数组赋值
for(int i=0;i<a.length;i++)
a[i]=i+1;
//i为元素下表,j代表当前要报的数
int i=0;
int j=1;
while(len>0){
if(a[i%m]>0){
if(j%n==0){//找到要出圈的人,并把圈中人数减一
System.out.print(a[i%m]+" ");
a[i%m]=-1;
j=1;
i++;
len--;
}else{
i++;
j++;
}
}else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
i++;
}
}
}
}
import java.util.Scanner;
public class Josephus1 {
private static class Node {
public int no;// 编号
public Node next;// 下一个节点
public Node(int no) {
this.no = no;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入总人数:");
int totalNum = scanner.nextInt();
System.out.print("请输入出圈数:");
int cycleNum = scanner.nextInt();
Node header = new Node(1);
Node pointer = header;
for (int i = 2; i <= totalNum; i++) {
pointer.next = new Node(i);
pointer = pointer.next;
}
pointer.next = header;
System.out.println("以下是出列的顺序:");
while (pointer != pointer.next) {
for (int i = 1; i < cycleNum; i++) {
pointer = pointer.next;
}
System.out.println(pointer.next.no);
pointer.next = pointer.next.next;
}
System.out.println(pointer.next.no);
}
}
看到workspace中有这么一个工程,拿出来以后没事看看