約瑟夫環問題(二) (難度 2顆星)

2021-08-02 02:30:32 字數 927 閱讀 7121

問題描述:

編號為1,2,…,n的n個人按順時針方向圍坐一圈,任選乙個正整數作為報數上限m,從第乙個人開始按順時針方向從自1開始順序報數,報道m時停止報數.報m的人出列,從他的順時針方向上的下乙個人開始重新從1報數,如此下去,直至所有人全部出列為止,輸出最後乙個出列的人的編號。

輸入輸出描述:

m和n由使用者輸入,並且保證m和n的範圍是【1,10000000】,輸出最後出列的編號。

問題分析:

為了方便說明,我們稍微轉換一下,假定標號是0到n-1,報數從0到m-1(主要是因為m%n是可能等於0的,這樣的轉換方便後面的運算),反正最後的結果加1就可以了。

k->0

k+1->1

k+2->2

k+3->3

k+4->4

……..

k-4->n-4

k-3->n-3

k-2->n-2

k-1->n-1

這個過程實際就是n個人的約瑟夫環問題降為了n-1個人的約瑟夫環問題,用同樣的方法,我們可以得到n-2個人的約瑟夫環問題,一直到1個人的約瑟夫環問題,從這個不斷縮小規模的過程中,我們可以發現編號的對應關係,如果在n-1個人的情況下某個人的編號是x,那麼這個人在n個人的情況下的編號一定是(x+k)%n

同理,如果我們求出t個人玩的時候最後出局的人標號為f(t),那麼t+1個人玩的時候出局的編號就是(f(t) + k)%(t+1)

最後結果總結成乙個遞推關係是為:

f(n)=(f(n-1)+k)%n=(f(n-1)+m%n)%n=(f(n-1)+m)%n

ps:

#include 

int main()

執行結果:

約瑟夫環問題(一)(難度 1顆星)

問題描述 編號為1,2,n的n個人按順時針方向圍坐一圈,任選乙個正整數作為報數上限m,從第乙個人開始按順時針方向從自1開始順序報數,報道m時停止報數.報m的人出列,從他的順時針方向上的下乙個人開始重新從1報數,如此下去,直至所有人全部出列為止,設計乙個程式求出出列順序.輸入輸出描述 m和n由使用者輸...

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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