历史学家约瑟夫有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数, 每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从, 约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。编写一个JAVA类, 计算出如果有45个犹太人参与游戏,约瑟夫和他的朋友安排在哪个位置才能生还?
- public class Test
- {
- /**
- *
- * {约瑟夫问题求解}
- *
- * @param args
- * @author:LJ
- */
- public static void main(String[] args)
- {
- //45个人参与游戏,初始化每个人的编号
- int[] poeple = new int[45];
- for (int m = 0; m < 45; m++)
- {
- poeple[m] = m + 1;
- }
- int count = 0; //报数器
- int killNum = 0; //自杀人数
- for (int i = 0; i < 45; i++)
- {
- //开始报数
- if (poeple[i] > 0)
- {
- count++;
- }
- //每报数到第3人,该人编号置为0(自杀),count=0重新报数
- if (count == 3)
- {
- poeple[i] = 0;
- count = 0; //置0重新报数
- killNum++; //自杀人数加1
- }
- //如果报数到最后一个人i=40,则i=-1循环报数
- if (i == 44)
- {
- i = -1;
- }
- //自杀人数达到43,则终止游戏
- if (killNum == 43)
- {
- break;
- }
- }
- //游戏结束,依次检查每个人的编号
- for (int i = 0; i < 44; i++)
- {
- //如果有生还者(编号大于0),则输出其编号
- if (poeple[i] > 0)
- {
- System.out.println("游戏生还者位置:" + poeple[i]);
- }
- }
- }
- }