用java编写的程序解决Josephus问题.
package array;
import javax.swing.JOptionPane;
public class Josephus{
/**
Josephus问题
*/
public static void main(String[] args) {
//输入
String bound = JOptionPane.showInputDialog(null, "输入孩子总数:",
"输入", JOptionPane.QUESTION_MESSAGE);
int N = Integer.parseInt(bound);
String message = "输入m的大小:(0-- ";
message += N + ")";
String m = JOptionPane.showInputDialog(null, message,
"输入", JOptionPane.QUESTION_MESSAGE);
int P = Integer.parseInt(m);
long time1 = System.currentTimeMillis(); //起始时间
//初始化
int []boy = new int[N];
for(int i=0;i<N;i++)
boy[i] = 1;
//处理
int result = find(boy,P,N);
System.out.println("/n有 " +N+ " 个孩子/n这里基数m是:" +P);
long time2 = System.currentTimeMillis();
long runtime = time2 - time1;
System.out.println("运行时间是: " +runtime+ "毫秒。");
//输出
String str = "最后一个孩子下标是:" + result;
JOptionPane.showMessageDialog(null, str,
" 结 果 ", JOptionPane.INFORMATION_MESSAGE);
}
static int find(int[] boy, int p, int n) {
boolean flag = true;
int count = 0;
int i = 0,k = 0;
k = n;
int result = 0;
//flag为false时退出
while(flag){
if(i == n){
i = 0;
continue;
}
if(boy[i] == -1) {
i++;
continue;
}
else
{
count++;
//循环到第p个孩子做标记,同时count清零
if(count == p){
boy[i] = -1;
count = 0;
k--;
System.out.println(" "+i);
}
if(k == 0)
{
result = i;
System.out.println(" 处理完毕:/n最后一个孩子下标是: "+i+" .");
break;
}
}
//数组下标前移
i++;
}
return result;
}
}