/*** 約瑟夫環問題
**假設有n個人、每當數到m的時候、就將第m個人出列、
*接下來從m+1個人開始從1數去、每當數到m的時候就出列
***************************==
第一次出列一定是編號為 (m%n - 1)剩下的人開始形成乙個新的約瑟夫環
從編號為m%n開始計數 假設 k=m%n 則新的約瑟夫環為:
k k+1 k+2 k+3 ... n-2 n-1 n 0 1 2... k-2 k-1
把新的約瑟夫環的編號和第一次的約瑟夫環進行對比:
k-->0
k+1-->1
k+2-->2
k+3-->3
....
k-2-->n-2
*****===
k-1-->n-1 :去除的編號
*****===
這樣從上面我們可以看出新的約瑟夫環 就是乙個擁有n-1個元素的
加入我們求出了這個新的約瑟夫環的解、例如x為該n-1個環的最終勝利者
那麼我們就可以推算出這個x在原來的n個元素的環中的位置
公式為:(x+k)%n %n:目的去掉整環
原來的k位置現在變成了0、相當於將原n個約瑟夫環整體向左移動了k個位置、
例如:將如下整體向左移動3個位置將3出列、超出部分補到後面
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 類似於迴圈佇列移動
這樣說來、我們如何計算n-2個約瑟夫環的解呢?同理我們只需要計算出n-3個約瑟夫環的
問題、以此類推、這樣的問題就是乙個遞推的問題
令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果自然是f[n]
遞推公式
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)
有了這個公式,我們要做的就是從1-n順序算出f[i]的數值,最後結果是f[n]。
因為實際生活中編號總是從1開始,我們輸出f[n]+1
由於是逐級遞推,不需要儲存每個f[i],程式也是非常簡單:
*/public class yuesefu
public static int yuesefu(int n,int m)
return s+1;
}
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫環問題
約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...