题目:
约瑟夫环问题起源于一个犹太故事。约瑟夫环问题的大意如下
罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家约瑟夫和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。大家决定了一个自杀方案,所有这41个人围成一个圆圈,由第1个人开始顺时针报数,每报数为3的人就立刻自杀,然后再由下一个人继续报数,仍然是每报数为3的人就立刻自杀……,直到所有人都自杀身亡为止。
约瑟夫并不想自杀,于是约瑟夫想到了一个计策,最后躲过了自杀。请问,他是怎么做到的?(这里写的是只剩约瑟夫一人)
解法一:数学大法,公式计算
举个例子:如果n(n>2)个人参与自杀,数到m的人自杀的话,按照公式lastnumber=(lastnumber+killnumber)%2(初始化状态下lastnumber=0)
import java.util.ArrayList;
public class Demo{
public static void main(String[]args) {
ArrayList<Integer>str=new ArrayList<Integer>();
for(int i=1;i<=3;i++)
str.add(i);
int lastnumber=0,killnumber=3;//killnumber为喊到这个number的人自杀
for(int i=2;i<=str.size();i++)
lastnumber=(lastnumber+killnumber)%i;
System.out.println(str.get(lastnumber));//实际编号
System.out.println(lastnumber);//list编号
}
}
解法二:往死里加方法
思路:num++和index++,比如,killnumber=3,用取余符号控制,满3就remove,index注意控制不要超出size
import java.util.ArrayList;
public class Demo1{
public static void main(String[]args) {
ArrayList<Integer>str=new ArrayList<Integer>();
for(int i=1;i<=41;i++)
{ str.add(i); }
int num=1,index=0;//值和索引
while(str.size()>1)
{
if(num%3==0)
{
str.remove(index);
index--;
}
num++;
index++;
index%=str.size();//防止index超过范围,到达极限就归0
}
System.out.println(str.get(0));
}
}