约瑟夫问题

来源:互联网 发布:吉林省典恒网络怎么样 编辑:程序博客网 时间:2024/05/24 04:59

问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。

public class Child {int no;Child nextChild = null;public Child(int no){this.no = no;}}
public class CycLink {Child firstChild = null;int len = 0;Child temp = null;int m = 0;//设置队列长度public void setLen(int len){this.len =len;}//设置第几个人出列public void setM(int m){this.m = m;}//创建队列,使用循环链表public void createCyc(){for(int i=1;i<=len;i++){Child ch = new Child(i);//第一个人为链表的第一个if(i==1){temp = firstChild = ch;}else{temp.nextChild = ch;temp = ch;//如果是最后一个人就链接到第一个人if(i==len){temp.nextChild = firstChild;}}}show();}public void play(){//定义两个指针,temp1用来找到第m个人的前一个人,temp2用来找到第m个人Child temp1 = firstChild;Child temp2 = null;for(int j=len;j>1;j--){//找到第m个人的前一个人for(int i=1;i<m-1;i++){temp1 = temp1.nextChild;}//把第m个人的前一个人链接到第m个人的后一个人temp2 = temp1.nextChild;temp1.nextChild = temp2.nextChild;temp1 = temp2.nextChild;}System.out.println("结果是:" + temp1.no);}public void show(){Child temp3 = this.firstChild;do{System.out.print(temp3.no + " ");temp3 = temp3.nextChild;} while(temp3 != this.firstChild);}}

public class Josefu {public static void main(String[] args) {// TODO Auto-generated method stubCycLink cyc = new CycLink();cyc.setLen(10);cyc.createCyc();cyc.setM(4);cyc.play();}}


原创粉丝点击