約瑟夫問題

2022-05-05 07:33:07 字數 1181 閱讀 5594

這是17世紀的法國數學家加斯帕在《數目的遊戲問題》中講的乙個故事:15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法:30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次投入大海的都是非教徒。

*問題分析與演算法設計

約瑟夫問題並不難,但求解的方法很多;題目的變化形式也很多。這裡給出一種實現方法。

題目中30個人圍成一圈,因而啟發我們用乙個迴圈的鏈來表示。可以使用結構陣列來構成乙個迴圈鏈。結構中有兩個成員,其一為指向下乙個人的指標,以構成環形的鏈;其二為該 人是否被扔下海的標記,為1表示還在船上。從第乙個人開始對還未扔下海的人進行計數,每數到9時,將結構中的標記改為0,表示該人已被扔下海了。這樣迴圈計數直到有15個人被扔下海為止。

*程式說明與注釋

#include

struct node

link[31]; /*30個人,0號元素沒有使用*/

int main()

link[30].nextp=1; /*第30個人的指標指向第乙個人以構成環*/

j=30; /*j:指向已經處理完畢的陣列元素,從link[i]指向的人開始計數*/

for(i=0;i<15;i++) /*i:已扔下海的人數計數器*/

else break; /*計數到15則停止計數*/

link[j].no_out=0; /*將標記置 0,表示該人已被扔下海*/

}for(i=1;i<=30;i++) /*輸出結果*/

printf("%c",link[i].no_out? '@':'+'); /*+:被扔下海, @:在船上*/

printf("\n");

}*執行結果

the original circle is(+:pagandom, @:christian):

+++@@+@+@@@+@+++@@+@@@+++@+@@+

(+"表示被扔下海海的非教徒 @:留在船上活命的教徒)

*思考題

有n個小孩圍 成一圈並依次編號,教師指定從第m個小孩開始報數,報到第s個小孩即令其出列。然後從下乙個孩子繼續報數,數到第s個小孩又令其出列,如此直到所有的孩子都出列。求小孩出列的先後順序。

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫問題

這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...