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();

}

}

三、项目文件结构

8c8f641664fd162c56db857c35598bed.png

四、运行效果

b29ce48fe8e9707b04ba038faf0874ad.png

五、其他补充

约瑟夫问题定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值