約瑟夫問題

2021-10-03 16:17:58 字數 1699 閱讀 8947

有n個人,編號為1~n,從第k(1<=k<=n)個人開始報數,從1開始報,報到m的人會出列,然後從第m+1個人開始,重複以上過程。直到所有讓出列,由此產生乙個出隊序列

1、先建立第乙個節點,讓first指向該節點,並形成環形

2、後面當我們每建立乙個新當節點,就把該節點加入到已有到環形鍊錶中

1、先生存乙個輔助變數cur,然後指向first

2、通過while遍歷,cur.next == first 結束

輸入引數n k m

1、建立乙個輔助變數helper,事先指向最後乙個節點

2、找到報數的目標,first和helper移動k-1次

3、當報數時候,讓first和helper同時移動m-1次

4、這時候將first指向節點出圈,經過(first = first.next,helper.next = first;),原來節點就消失了

package linkedlist;

public

class

josepfu

}// 建立乙個環形的單向鍊錶

class

circlesinglelinkedlist

// 輔助變數

jnode cur = null;

for(

int i =

1; i <= nums; i++

)else}}

// 遍歷當前環形鍊錶

public

void

list()

jnode cur = first;

while

(true

) cur = cur.next;}}

/** *

* @param no 第幾個節點開始

* @param countnum 數多少下

* @param nums 初始有多少個節點

*/public

void

count

(int no,

int countnum,

int nums)

this

.add

(nums)

;// 建立輔助變數

jnode helper = first;

// 將輔助變數指向最後乙個節點

while

(true

) helper = helper.next;

}// 找到開始的節點

for(

int j =

0; j < no-

1; j++

)// 報數前,讓first和helper同時移動 m-1 次,然後出圈

while

(true

)for

(int j =

0; j < countnum-

1; j++

)// 出圈節點

system.out.

println

(first.id)

;// 出圈

first = first.next;

helper.next = first;

} system.out.

println

(helper.id);}

}// 建立節點

class

jnode

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫問題

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