約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知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值。輸...