迴圈鍊錶模擬約瑟夫(josephu)問題

2021-09-24 10:14:55 字數 2152 閱讀 2873

約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

class

boypublic

intgetno()

public

void

setno

(int no)

public boy getnextboy()

public

void

setnextboy

(boy nextboy)

@override

public string tostring()

';}}

/**

* 指向第乙個節點

*/boy first = null;

/** * 建立迴圈鍊錶

* @param nums :玩家個數

*/public

void

createboys

(int nums)

for(

int i =

1; i <= nums; i++

)//不是第乙個節點

else

}}

/**

* 遍歷迴圈鍊錶

*/public

void

showboys()

//設定輔助節點

boy cur = first;

boolean notlast =

false

;while

(!notlast)

//當前指標後移

cur = cur.

getnextboy();}}

/**

* 按照約瑟夫法則出圈,報到countnum的小孩出圈

* @param nums 小孩的個數

* @param startno 開始報數的小孩

* @param countnum 報數多少次

*/public

void

selectboy

(int nums,

int startno,

int countnum)

if(nums <

1|| startno > nums)

//1建立乙個helper指標指向first的前乙個

boy helper = first;

while

(true

) helper = helper.

getnextboy()

;}//2報數前讓first移動到開始位置,helper移動到first前乙個位置,移動 startno-1 次

for(

int i =

0; i < startno-

1; i++

)//3開始報數

while

(true

)//迴圈countnum-1次(因為自己就佔了一次),尋找出圈小夥子

for(

int i =

0; i < countnum-

1; i++

)//輸出出圈的小孩,first就是要出圈的小孩

system.out.

printf

("出圈的是 %d 號小孩\n"

,first.

getno()

);//出圈操作

// first 後移

first = first.

getnextboy()

;//helper 指向first

helper.

setnextboy

(first);}

//出圈完畢,列印最後乙個小孩

system.out.

println

("圈中最後乙個小孩是:"

+first.

getno());}

結果

迴圈鍊錶 Joseph問題

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

迴圈鍊錶模擬約瑟夫環

問題引入 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報...

約瑟夫問題 list模擬迴圈鍊錶

time limit 1000ms memory limit 65536k 有疑問?點這裡 n個人想玩殘酷的死亡遊戲,遊戲規則例如以下 n個人進行編號,分別從1到n,排成乙個圈,順時針從1開始數到m,數到m的人被殺,剩下的人繼續遊戲,活到最後的乙個人是勝利者。請輸出最後乙個人的編號。輸入n和m值。輸...