约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
自己通过问题含义进行如下编写Java代码:
package com.liang.josephus;
/**
*
* @author zhaoliang
* 约瑟夫问题
* @date 2014-11-12
* @time 16:51
*/
public class Josephus {
/**
*
* @param n 一共有多少个人 报数
* @param start 从第几个开始报数
* @param step 报数的步长
* @return
*/
public int getResult(int n,int start,int step){
int[] all=null;
//初始化这个队列
if(all==null){
all=new int[n];
for(int i=0;i<n;i++){
all[i]=i+1;
}
}
//计算出数组的开始数下标
int startIndex=start%n-1;
while(all[1]!=0){
for(int i=0;i<n;i++){
System.out.print(all[i]+"-");
}
System.out.println();
//计算出要删除数组的下标
int removeIndex=(startIndex+step-1)%n;
startIndex=removeIndex;
//将后面的数字往前移动一个位置
while(removeIndex<n-1){
all[removeIndex]=all[removeIndex+1];
removeIndex++;
}
//将最后一个位置的数字设置为0
all[n-1]=0;
//每次只删除一个
n--;
}
System.out.println();
return all[0];
}
/**
* @param args
* 测试
*/
public static void main(String[] args) {
Josephus josephus=new Josephus();
System.out.println(josephus.getResult(10, 2, 5));
}
}