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