這是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):
+++@@+@+@@@+@+++@@+@@@+++@+@@+
(+"表示被扔下海海的非教徒 @:留在船上活命的教徒)
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
include using namespace std typedef struct nodelistnode typedef listnode linklist linklist initring int n,linklist r linklist deletedeath int n,int k,...