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的运行结果: