約瑟夫問題

2022-07-29 13:21:07 字數 2033 閱讀 4610

josephu(約瑟夫,約瑟夫環)問題

問題表述為:設編號為1,2,...,n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依此類推,直到所有人出列為止,由此產生乙個出隊編號的序列

(一)約瑟夫問題-建立環形鍊錶的思路**

(二)約瑟夫問題-小孩出圈的思路分析圖

建立環形的單向鍊錶

class

circlesinglelinkedlist

boy curboy=null;//

輔助指標,幫助構建環形鍊錶

//使用for迴圈建立環形鍊錶

for(int i=1;i<=nums;i++)

else}}

//遍歷當前環形鍊錶

public

void

showboy()

//因為first不能動,所以使用輔助指標遍歷

boy curboy=first;

while(true

) curboy=curboy.getnext();}}

//根據使用者輸入計算出節點出圈的順序

/***

* @param

startno 表示從第幾個節點開始數

* @param

countnum 表示數幾下

* @param

nums 表示最初有多少節點在圈中

*/public

void countboy(int startno,int countnum,int

nums)

//建立要給輔助指標,幫助完成節點出圈

boy helper=first;

while(true

) helper =helper.getnext();

}//小孩報數前,先讓first和helper移動k-1次

for(int j=0;j)

//當小孩報數時,讓first和helper指標同時的移動m-1次,然後出圈

//迴圈操作,直到圈中只有乙個節點

while(true

)

//讓first和helper指標同時移動countnum-1

for(int j=0;j)

//這時first指向的節點,就是要出圈的小孩節點

system.out.printf("小孩%d出圈\n",first.getno());

first=first.getnext();

helper.setnext(first);

}system.out.printf("最後留在圈中的小孩編號為%d",first.getno ());

}}//

建立乙個boy類,表示乙個節點

class

boy

public

intgetno()

public

void setno(int

no)

public

boy getnext()

public

void

setnext(boy next)

}執行結果:

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫問題

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