本文主要是介绍java 约瑟夫_基于java的约瑟夫杀人问题算法解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、需求
实现约瑟夫杀人算法
二、代码实现过程
代码实现过程:详情请看的我的csdn博客
1.数据结构部分:
我们将问题抽象提取一下,首先我们需要一个节点来储存单个俘虏的信息,然后我们需要一个环状来表示所有的俘虏,然后再写算法,
2.算法部分:
算法具体实现:可以先用一个计数器,从开始遍历环开始计数,到计数器等于M时,进行删除节点。
3.代码构建:
由于是运用java语言描述,所以单独将节点和算法分别抽象成一个类
3.1构建节点类public class Node {
//定义为私有属性便于便方法调用时好管理
private int value;//节点的值
private Node nextNode;//节点的指向(递归思想)
public Node(int value) {
this.value=value;
}
public Node() {
super();
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getNextNode() {
return nextNode;
}
public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
}
}
3.2 具体算法类public class Joseph {
private static int MAXNUM;//俘虏总人数
private static int NUM;//从那个开始杀(M)
//提供有参构造方法方便用户自定义俘虏总人数,和M
public Joseph(int MAXNUM,int NUM) {
this.MAXNUM=MAXNUM;
this.NUM=NUM;
}
//算法的主要实现部分
public void kill() {
//构造链表(初始化链表)
Node head=new Node(1);
Node x=head;
for(int i=2;i<=MAXNUM;i++){
x.setNextNode(new Node(i));
x=x.getNextNode();
}
//使链表为循环链表
x.setNextNode(head);
while(x!=x.getNextNode()){
for(int i=1;i
x=x.getNextNode();
}
System.out.println("宝贝你被杀了哟:"+x.getNextNode().getValue());
//删除节点
x.setNextNode(x.getNextNode().getNextNode());
}
System.out.println("宝贝已经杀完了!!!你是最后的幸运儿哟:"+x.getValue());
}
}
3.3 测试类import java.util.Scanner;
public class TextMain {
public static void main(String[] args) {
System.out.println("请输入俘虏的总人数");
Scanner scanner=new Scanner(System.in);
int MAXNUM=scanner.nextInt();
System.out.println("请输入从第几个开始杀");
int NUM=scanner.nextInt();
Joseph joseph=new Joseph(MAXNUM,NUM);
joseph.kill();
}
}
三、项目文件结构
四、运行效果
五、其他补充
约瑟夫问题定义
这篇关于java 约瑟夫_基于java的约瑟夫杀人问题算法解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!