約瑟夫環是乙個數學的應用問題:已知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報數,如此下去,直到所有人...