約瑟夫環問題

2021-05-22 19:47:47 字數 1009 閱讀 1275

一設計任務書

課題名:約瑟夫環問題

問題描述:

題的一種描述是:編號為1,2,....,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數).一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數.報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始 重新從1報數,如此下去,直至所有人全部出列為止.試設計乙個程式求出出列順序.

基本要求:

利用單向迴圈鍊錶儲存結構模擬此過程,按照出列的順序印出各人的編號.

測試資料:

m的初值為20;n=7;7個人 的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5)

三程式的設計

1.    演算法思想

通過我們對約瑟夫問題的分析,我們認為單迴圈鍊錶能較好的解決問題。在建立迴圈鍊錶時,因為約瑟夫環的大小有輸入決定。因此與匹配的結點數也是變化的,所以要進行動態記憶體分配。輸出資料的儲存單元也就需要動態分配了,為方便操作,我們將每個結點資料域的值定為生成該結點時的順序號。

進行操作時,我們用乙個變數j來記住掃瞄過的結點,當掃瞄到需輸出的結點的前乙個結點時,我們將其直接後繼結點的資料域值輸出,並釋放已輸出資料域值的那個結點,然後將j置0,讓j從被刪除結點的下乙個結點重新記數,這樣不斷重複這一系列動作,就可以輕鬆解決約瑟夫環問題.

typedef struct child*boy;

#include

#include

void input(boy &h,int n)

p->hand=h;

}//儲存約瑟夫環

void output(boy &h,int mark)

printf("%d ",p->no);

c=p->mark ;

q->hand=p->hand;

free(p);

p=q->hand;

i=1;

}printf("%d",p->no);

}main()

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

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