約瑟夫環問題

2021-10-09 17:42:44 字數 1406 閱讀 3596

約瑟夫環是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

輸入8 1 3 (n=8 k=1 m=3 )

輸出7 (剩下的那個)

樣例輸入

8 1 3

樣例輸出

71.分析問題:已知編好號的一群人圍成一圈,做遊戲,有乙個數字m,從第k個人開始報數,後面的人挨著報數,報道m時,該人出局,由下乙個從1開始報,以此類推,直到最後乙個人結束;現在就是給你總人數n,第k個開始,特殊數字為m,找出最後乙個人;

2.解決問題的思想:首先爭對此問題,第一想法就是迴圈,乙個乙個出局,然後找出最後乙個出局的即可完成任務;

3.解題步驟:

a.首先根據解題思想,首先由於是連續的數,判斷是否出局,得需要乙個bool型別的陣列來儲存狀態(出局為false);

b.利用迴圈語句,寫出從第k個人開始,然後當數到m時此人出局,當迴圈一遍之後未出結果,然後接著進行下去(從狀態還是true,那些人也就是對應的編號;)

c.當淘汰人數為n時就輸出最後的編號,便為索要結果;

如下oj上提交遇到問題的**

runtime error

#include

using

namespace std;

intmain()

if(count==n)}if

(i==n) i=0;

}delete

ch;return0;

}

然後ac的思路:

1.解決問題:看是否可以找出遞推公式,經過上網查詢找到了遞推公式(預設為從第乙個人開始);

從n個人,由0開始編號,然後第一次是淘汰第m-1這個人;

然後第二次從m開始,淘汰的便是第m-1+m(在不超過總人數n的情況下);

衍生遞推公式為:f (i) = f (i-1) +m;然後考慮到超出總人數的範圍,那麼求模即可,所以最後為:f (i)=(f (i-1)+m)%i

遞推結束即為f(1)=0;

2.解題步驟:

a.根據匯出的遞推公式,從2開始推到n得出的最後乙個人的序號;

b.然後根據要從第k個人開始,那麼就是相當於把k前面的人放到後面,也可以在得出的序號上面直接加上乙個k,大於n則取模;

#include

using

namespace std;

intmain()

if(count+k==n) cout

(count+k)

%n

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...