必威体育Betway必威体育官网
当前位置:首页 > IT技术

Java实现约瑟夫问题

时间:2019-08-10 19:42:09来源:IT技术作者:seo实验室小编阅读:63次「手机版」
 

约瑟夫问题

有这样一个问题,有N个人围成一圈做游戏,编号为1->2->3->...->1,让第m个人开始报数,报到底k个数的那个人出队,出队的下一个人继续报数,报到第k个数的人再出队。。。以此类推,求出最后一个出队的人。

这个问题可以转化成数据结构的循环链表问题。具体抽象为创建循环链表,输出链表,按照题意找到符合要求的那个结点并删除,循环删除的过程,直到循环链表只剩下一个元素,即为最后一个出队的元素。  具体的代码和过程如下:(以n=5,m=2,k=2为例)

public class Demo1 {

public static void main(String[] args){

CycLink link  = new CycLink();

link.setLen(5);

link.creatLink();

link.setM(2);

link.setK(2);

link.show();

link.play();

}

}

class Node{

public int no;

Node nextNode;

public Node(int no){

this.no = no;

}

}

class CycLink{

Node firstNode = null;

Node p = null;

int len=0;

int m; //第m个人

int k;//报k个数

//设置链表大小

public void setLen(int len){

this.len =len;

}

//创建环形链表

public void creatLink(){

for(int i=1;i<=len;i++){

//创建第一个结点

if(i==1){

Node node = new Node(i);

this.firstNode = node;

this.p = node;

}else{

if(i==len){

Node node = new Node(i);

p.nextNode = node;

p=node;

p.nextNode=this.firstNode;

}else{

Node node = new Node(i);

p.nextNode = node;

p = node;

}

}

}

}

//设置第m个人报数 

public void setM(int m){

this.m = m;

}

//设置报几个数

public void setK(int k){

this.k = k;

}

//开始游戏

public void play(){

//找到第m个人

Node temp = this.firstNode;

Node temp2 = this.firstNode;

for(int i=1;i<m;i++){

temp = temp.nextNode;

}

//找到出队的人

for(int j=1;j<k;j++){

temp = temp.nextNode;

}

//出队

while(temp2.nextNode!=temp){

temp2=temp2.nextNode;

}

temp2.nextNode=temp.nextNode;

temp=temp.nextNode;

this.len--;

//输出最后一个出队的人

System.out.println("the last person's number is "+temp.no);

}

//打印循环链表

public void show(){

Node temp = this.firstNode;

do{

System.out.print(temp.no+" ");

temp=temp.nextNode;

}while(temp!=this.firstNode);

}

}

实现的结果截图:

相关阅读

谈谈如何降低(减少)AMD显卡发热量的问题

工作环境(蓝色粗体字为特别注意内容) 1,系统环境:Win7 Ultimate sp1、Catalyst Control Center2,硬件环境:intel core i3、3,参考文献:

Java采用Http方式实现大文件下载

Java采用Http方式实现大文件下载 java实现大文件下载,基于http方式,控件神马的就不说了。 思路:下载文件无非要读取文件然后写文

关于margin-right失效的问题

关于margin-right失效的问题:浏览器默认从左往右渲染元素,在没有超出父容器的宽度的前提下  如果子容器的宽度能够被容纳  设置

SecureCRT乱码问题---已解决

SecureCRT是一款支持SSH的终端仿真程序,用于连接运行包括Windows、UNIX和VMS的工具。对于学ARM的人来说,这个软件也是十分的好用! 下

什么是javabean及其用法

一、什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须

分享到:

栏目导航

推荐阅读

热门阅读