Java约瑟夫(Josephus)环的实现

package com.xztsummer;

/**

 * 新浪SAE普通开发者认证活动

 * 数组实现约瑟夫环问题

 * 圈人数16<N<32,被杀死的人报的数 2<M<10

 * @author SUMMER

 *新浪微博@xztsummer

 */

public class Josephus {

	/**

	 * 

	 * @param n 总人数 16<N<32

	 * @param m 被杀死的人报的数 2<M<10

	 */

	public void sequence(int n,int m){

		//初始创建有m个值得数组

		int []a=new int[n];

		//数组的初始长度

		int length=n;

		//给数组赋值

		for(int i=0;i<a.length;i++){

			a[i]=i+1;

		}

		//i为元素下标,j代表报的数,k表示死亡的顺序

		int i=0,j=1,k=1;

		while(length>0){//数组不为空

			if(a[i%n]>0){//数组中没有出圈的元素,出圈的数组元素会被标记为-1

				if(j%m==0){//找到出圈的人,并把圈中人数减1

					System.out.println("第"+k+"个死亡出圈的人编号是:"+a[i%n]);

					a[i%n]=-1;//出圈的数组元素标记为-1

					j=1;//报数又从1开始

					i++;

					k++;

					length--;//数组长度减1

				}else{//数组中的普通元素

					i++;

					j++;

				}

			}else{//数组中已经出圈的元素

				i++;//i增加,j不加,表示直接跳过,不报数

			}

		}

	}



	public static void main(String[] args) {

		Josephus jsp=new Josephus();

		//定义N=25,M=4,执行排序

		jsp.sequence(25, 4);

	}

}

M=25,N=4的运行结果:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值