約瑟夫問題

2021-10-10 17:23:45 字數 3131 閱讀 1162

josephu(約瑟夫、約瑟夫環)  問題 josephu  問題為:設編號為1,2,… n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類

推,直到所有人出列為止,由此產生乙個出隊編號的序列。

舉個例子

n = 5 , 即有5個人

k = 1, 從第乙個人開始報數

m = 2, 數2下

經過一次出圈後

第二次出圈

第三次出圈

第四次出圈

所以最終的出圈順序 2->4->1->5->3

以上方法是使用單向迴圈鍊錶來完成的,下面看**展示

建立乙個孩子類,每個孩子物件表示乙個節點

class boy

public int getno()

public boy getnext()

public void setno(int no)

public void setnext(boy next)

}

建立單向迴圈鍊錶

並且建立新增孩子和顯示的方法

class circlesinglelinkedlist

/*** 新增指定的節點

* @param nums

*/public void add(int nums)

boy curboy = null;

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

public void showboy()

//因為first不能動,所以建立乙個輔助指標

boy curboy = first;

while(true)}}

重點:出圈

/**

* 根據使用者輸入,計算小孩出圈的順序

* @param startno 開始小孩的編號

* @param countnum 一次數幾下

* @param nums 總共小孩數

*/public void countboy(int startno,int countnum,int nums)

//建立輔助指標,指向first指標的前一位

boy helper = first;

while(helper.getnext() != first )

//根據開始小孩的編號,是first指標指向開始小孩

for (int i = 0; i < startno - 1; i++)

//開始報數出隊

while(first.getnext() != first)

//出隊

system.out.println("小孩" + first.getno() + "出圈~~");

helper.setnext(first.getnext());

first = first.getnext();

}system.out.println("最後出圈的小孩編號" + first.getno());

}

所有**

public class josephu 

}//單向迴圈鍊錶

class circlesinglelinkedlist

/*** 新增指定的節點

* @param nums

*/public void add(int nums)

boy curboy = null;

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

public void showboy()

//因為first不能動,所以建立乙個輔助指標

boy curboy = first;

while(true)

}/**

* 根據使用者輸入,計算小孩出圈的順序

* @param startno 開始小孩的編號

* @param countnum 一次數幾下

* @param nums 總共小孩數

*/public void countboy(int startno,int countnum,int nums)

//建立輔助指標,指向first指標的前一位

boy helper = first;

while(helper.getnext() != first )

//根據開始小孩的編號,是first指標指向開始小孩

for (int i = 0; i < startno - 1; i++)

//開始報數出隊

while(first.getnext() != first)

//出隊

system.out.println("小孩" + first.getno() + "出圈~~");

helper.setnext(first.getnext());

first = first.getnext();

}system.out.println("最後出圈的小孩編號" + first.getno());

}}//建立乙個boy節點,沒乙個物件表示乙個孩子

class boy

public int getno()

public boy getnext()

public void setno(int no)

public void setnext(boy next)

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫問題

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