約瑟夫問題求解

        歷史學家約瑟夫有過以下的故事:在羅馬人佔領喬塔帕特後,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. }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章