约瑟夫问题(数组篇)
最近招聘看到很多同学碰到一道题目,n个人围成一圈,从第一个开始报数,当报的M时,该人出列,问最后出列的人的原始编号为多少,这是约瑟夫问题,问题的来历你们自己去搜,我用java写了个例子,下面我们来解释一下
我这给的是20个人报到3出列
代码
public class test11 {
//约瑟夫问题
static int a []=new int[20]; //创建一个数组给定每个人的原始序号
static boolean b[]=new boolean[20]; // 创建一个布尔数组给每个人一个初始状态
static int num=1; // 报数的数初始值
static void init(int a[],int num){
for(int i=0;i<a.length;i++){
a[i]=i+1;
} //初始化数组给定数组编号
int i=0; //给数组下标
while(true){
if(i==a.length-1){
i=-1;
}else{
i++; //每次循环i+1
每次循环num+1
if(b[i]==true){ //开始判断检测
continue; //如果b[i] 已经出列 就跳过
}else{
num++;
if(num==3){ //如果没有 当计数到达3的时候
num=0; //清零
b[i]=true; //把当前编号的状态改为true
System.out.print(a[i]+" && "); //打印出列编号
}
}
}
}
}
public static void main(String[] args)
{
init(a, num);
}
}
}