感覺挺好的,就貼出來給大家看看吧
關於約瑟夫問題:
這是17世紀的法國數學家加斯帕在《數目的遊戲問題》中講的一個故事:15個教徒和15
個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了一個辦法:30個人圍成一圓圈,從第一個人開始依次報數,每數到第九個人
就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次投入大海的都是非教徒。
public class yuesefu {</p><p>public static void main(String[] args) {<br />// TODO Auto-generated method stub<br />System.out.println("約瑟夫問題");<br />CycLink cyclink=new CycLink();<br />cyclink.setLen(9);<br />cyclink.createLink();<br />cyclink.setK(5);<br />cyclink.setM(3);<br />cyclink.show();<br />cyclink.play();<br />}<br />}<br />class Child{<br />int no;<br />Child nextChild=null;<br />public Child(int index)<br />{<br />//定一個編號<br />this.no=index;<br />}<br />}<br />class CycLink{<br />Child firstChild=null;//指向第一個人<br />Child temp=null;//跑龍套<br />int len=0;//表示多少個人<br />int k=0;//從第幾個人開始數數<br />int m=0;//數幾下<br />//設定鏈表大小<br />public void setLen(int len)<br />{<br />this.len=len;<br />}<br />public void setK(int K)<br />{<br />this.k=K;<br />}<br />public void setM(int M)<br />{<br />this.m=M;<br />}<br />//設定環形鏈表<br />public void createLink()<br />{<br />for(int i=1;i<=len;i++)<br />{<br />if(i==1)<br />{<br />//建立第一個人<br />Child ch=new Child(i);<br />this.firstChild=ch;<br />this.temp=ch;<br />}else<br />{<br />//建立最後一個人<br />if(i==len)<br />{<br />Child ch=new Child(i);<br />temp.nextChild=ch;<br />temp=ch;<br />temp.nextChild=this.firstChild;<br />}else<br />{<br />//繼續建立<br />Child ch=new Child(i);<br />temp.nextChild=ch;<br />temp=ch;<br />}<br />}<br />}<br />}<br />//列印鏈表<br />public void show(){<br />Child temp=this.firstChild;//跑龍套<br />System.out.print("人數編號:");<br />do{<br />System.out.print(" "+temp.no);<br />temp=temp.nextChild;<br />}while(temp!=this.firstChild);<br />System.out.println();<br />}<br />//開始play<br />public void play()<br />{<br />Child temp=this.firstChild;<br />//1.找到開始數數的人<br />for(int i=1;i<k;i++)<br />{<br />temp=temp.nextChild;<br />}<br />System.out.print("從第"+this.k+"個人開始,數"+this.m+"的人依次是:");<br />while(this.len!=1)<br />{<br />//2.數m下<br />for(int j=1;j<m;j++)<br />{<br />temp=temp.nextChild;<br />}<br />//3.將數到m的人刪除鏈表<br />Child temp2=temp;<br />System.out.print(" "+temp2.no);<br />//數到m的人繼續往下走,走到數到m-1的那個人,將m-1的下一跳指向m的下一跳<br />while(temp2.nextChild!=temp)<br />{<br />temp2=temp2.nextChild;<br />}<br />//將m-1的下一跳指向m的下一跳,即刪除數到m的人<br />temp2.nextChild=temp.nextChild;<br />temp=temp.nextChild;<br />this.len--;<br />}<br />System.out.println();<br />System.out.println("剩下的是:"+temp.no);<br />}<br />}