有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個人為止。問怎樣排法,才能使每次...