7 9 約瑟夫問題 陣列實現

2022-09-17 08:45:17 字數 1243 閱讀 4200

【問題描述】

有m個人,其編號分別為1-m。按順序圍成乙個圈,現在給定乙個數n,從第乙個人開始依次報數,報到n的人出圈,

然後再從下乙個人開始繼續從1開始依次報數報到n的人再出圈,…如此迴圈,直到最後乙個人出圈為止。程式設計輸出所有人出圈的順序。

輸入格式

一行兩個正整數m和n,之間用乙個空格隔開,1≤m<100,1≤n≤32767。

輸出格式

輸出m行,每行乙個正整數,表示依次出圈的人的編號。

輸入樣例

85輸出樣例

5 2 

8  7  

1  4  

6  3

問題分析

定義bool型陣列p,表示每個人在圈中的狀態。假設p[i]為true表示第i個人還在圈中,

p[i]為 false表示第i個人已出圈。模擬報數的過程,從第乙個人(i=1)開始報數,定義計數

器j,初始化為0,如果p[i]為tmue,則j加1,當j為n時,報到的這個人出圈(p[i]=false,且

j=0),…直到所有人都已出圈。程式實現時,另外設計乙個計數器t,記錄圈中的剩餘人數,

初始化為m。

題解**:

#include

#include

#include

using namespace std;

int m,n;

listl;

int main()

if(cnt2==n)

else

}return 0;

}題解思路:

這道題的思路即為構造乙個環,使得對應座標指標i能在佇列中從頭到尾的一次又一次遊走,我們先定義i作為1到m的指標,定義cnt1為元素個數,cnt2為每次計數1到n時的值,即約瑟夫環1到n的指標。定義乙個bool型陣列p,代表當前元素是否已出列。

具體實現:用乙個while迴圈判斷cnt1元素個數是否為0,迴圈中每出列乙個元素,則cnt1--,若cnt1==0則元素已全部出列,跳出迴圈。

while中,判斷i的值,若i==m說明已到達結尾外,需返回佇列開頭,令i=0。(注意,我們取得元素下標為0到m-1),若p[i]==true,說明已出列,則continue進入迴圈下一階段,若p[i]==false,則在佇列中,cnt2為計數1到n中的第幾個,若為n說明應當刪去,cnt2=1,printf輸出對應的值;若cnt2小於n,則cnt2++,進入下次迴圈

(注意,我的每次運算中i與cnt2指標的值都在該迴圈階段之前已計算出,計算前與計算後的邏輯關係同學們需要好好思索,搞清楚)

約瑟夫環問題 佇列實現,迴圈陣列實現

起源 約瑟夫環問題的起源來自猶太歷史學家約瑟夫和他的朋友以及39其餘的猶太人,總共41人為了躲避敵人,藏在乙個山洞中,39個猶太人決定寧願死也不被敵人抓到,於是決定自殺,所有人排成乙個圈,由第乙個人開始報數,每當數到3,就自殺。這個遊戲接著從自殺的位置開始,還是從1數到3。依次類推,約瑟夫將朋友和自...

約瑟夫環(陣列實現)

有 m 個人,每次數 n 個殺死,問從第幾個開始數可以保證第乙個人活到最後。include define ll long long define inf 0x3f3f3f3f define endl n using namespace std const int n 1e6 100 int a n ...

python實現約瑟夫 約瑟夫問題python實現

python語言之如何實現約瑟夫環問題 def josephus n,m if type n 60個人從1開始編號每人拿乙個號碼牌排成圈,從 1開始報數,第一次報數 totalnum 猴子總數 startnum 開始序號 intervalnum 間隔數def kingelect totalnum,s...