問題:
已知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...