import java.util.ArrayList;
public class JosephProblem {
/**
* 用java代码实现:已知50个人(以编号1,2,3...50分别表示)围坐在一张圆桌周围。
* 从编号为1的人开始报数,数到3的那个人出列;
* 他的下一个人又从1开始报数,数到3的那个人又出列;
* 依此规律重复下去,求最后一个留下来的人是原来的第几位?
* @param args
*/
public static void main(String[] args) {
int total = 50;
int interval = 3;
int i, people = 0;
ArrayList<Integer> peoples = new ArrayList<>();
for(int j = 1;j <= total;j ++){
peoples.add(j);
}
int result = taotai(peoples,1);
System.out.println(result + "号是最后留下来的");
}
//传入的是存放人员编号的集合,index是报数的指针。
//当报数人不是3号,就把该人员放到新的集合中,报数号+1,如果是三号就继续下一轮报数,同时把index初始化成1,一轮结束完后,判断新人员的集合大小是否只有一个人,如果只有一个人的话返回人员编号,如果不是一个人的话就递归调用,进行下一轮报号,同时传入当前报数的值。
public static int taotai(ArrayList<Integer> list,int index){
ArrayList<Integer> arraylist = new ArrayList<>();
for(int i = 0; i < list.size();i++){
if(index != 3){
arraylist.add(list.get(i));
index ++;
}else{
index = 1;
continue;
}
}
if(arraylist.size() > 1){
return taotai(arraylist,index);
}else{
return arraylist.get(0);
}
}
}
约瑟夫环
最新推荐文章于 2022-05-04 19:46:17 发布