第一題 約瑟夫環問題

2021-05-09 20:56:54 字數 1197 閱讀 7168

問題:

已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;

他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

解題**如下:

public class yuesehu

//判斷是否全部出列

private int total(int t)

return 0;

}private int out()}}

return count;}}

問題:求最後乙個出圈?

解題思路:

在這n個數字中,第乙個被刪除的數字是m%n-1,為簡單起見記為k。

那麼刪除k之後的剩下n-1的數字為0,1,…,k-1,k+1,…,n-1,並且下乙個開始計數的數字是k+1。

相當於在剩下的序列中,k+1排到最前面,從而形成序列k+1,…,n-1,0,…k-1。

該序列最後剩下的數字也應該是關於n和m的函式。由於這個序列的規律和前面最初的序列不一樣

(最初的序列是從0開始的連續序列),因此該函式不同於前面函式,記為f』(n-1,m)。

最初序列最後剩下的數字f(n,m)一定是剩下序列的最後剩下數字f』(n-1,m),所以f(n,m)=f』(n-1,m)。

接下來我們把剩下的的這n-1個數字的序列k+1,…,n-1,0,…k-1作乙個對映,對映的結果是形成乙個從0到n-2的序列:

n-2把對映定義為p,則p(x)= (x-k-1)%n,即如果對映前的數字是x,則對映後的數字是(x-k-1)%n。

對應的逆對映是p-1(x)=(x+k+1)%n。

由於對映之後的序列和最初的序列有同樣的形式,

都是從0開始的連續序列,因此仍然可以用函式f來表示,記為f(n-1,m)。

根據我們的對映規則,對映之前的序列最後剩下的數字f』(n-1,m)= p-1

把k=m%n-1代入得到f(n,m)=f』(n-1,m)=[f(n-1,m)+m]%n。

經過上面複雜的分析,我們終於找到乙個遞迴的公式。

要得到n個數字的序列的最後剩下的數字,只需要得到n-1個數字的序列的最後剩下的數字,

並可以依此類推。當n=1時,也就是序列中開始只有乙個數字0,那麼很顯然最後剩下的數字就是0。

我們把這種關係表示為:

0n=1

f(n,m )={

n>1

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫環雜題

n個人圍成一圈順序編號,從1號開始按1 2 3順序報數,報3者退出圈外,其餘的人再從1 2 3開始報數,報3的人再退出圈外,依次類推。請按退出順序輸出每個退出人的原序號。要求使用環行鍊錶程式設計。模擬題。1 include 2 include 3 using namespace std 45 typ...