历史学家约瑟夫有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数, 每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从, 约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。编写一个JAVA类, 计算出如果有45个犹太人参与游戏,约瑟夫和他的朋友安排在哪个位置才能生还?

 
  1. public class Test  
  2. {  
  3.     /**  
  4.      *   
  5.      * {约瑟夫问题求解}  
  6.      *   
  7.      * @param args  
  8.      * @author:LJ 
  9.      */ 
  10.     public static void main(String[] args)  
  11.     {  
  12.         //45个人参与游戏,初始化每个人的编号  
  13.         int[] poeple = new int[45];  
  14.         for (int m = 0; m < 45; m++)  
  15.         {  
  16.             poeple[m] = m + 1;  
  17.         }  
  18.         int count = 0//报数器  
  19.         int killNum = 0//自杀人数  
  20.         for (int i = 0; i < 45; i++)  
  21.         {  
  22.             //开始报数  
  23.             if (poeple[i] > 0)  
  24.             {  
  25.                 count++;  
  26.             }  
  27.             //每报数到第3人,该人编号置为0(自杀),count=0重新报数  
  28.             if (count == 3)  
  29.             {  
  30.                 poeple[i] = 0;  
  31.                 count = 0//置0重新报数  
  32.                 killNum++; //自杀人数加1  
  33.             }  
  34.             //如果报数到最后一个人i=40,则i=-1循环报数  
  35.             if (i == 44)  
  36.             {  
  37.                 i = -1;  
  38.             }  
  39.             //自杀人数达到43,则终止游戏  
  40.             if (killNum == 43)  
  41.             {  
  42.                 break;  
  43.             }  
  44.         }  
  45.         //游戏结束,依次检查每个人的编号  
  46.         for (int i = 0; i < 44; i++)  
  47.         {  
  48.             //如果有生还者(编号大于0),则输出其编号  
  49.             if (poeple[i] > 0)  
  50.             {  
  51.                 System.out.println("游戏生还者位置:" + poeple[i]);  
  52.             }  
  53.         }  
  54.     }  
  55.  
  56. }