关于Josephus解法

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中有这么一个工程,拿出来以后没事看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值