約瑟夫環的問題

2021-06-28 15:22:53 字數 1180 閱讀 1767

/*** 約瑟夫環問題

**假設有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報數,如此下去,直到所有人...