一、约瑟夫环背后的故事

约瑟夫是公元一世纪重要的历史学家,公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中。罗马将军韦斯巴芗(Vespasian)派人来劝降,他主张投降,其余的人不答应,并以死相逼。于是,他提出用约瑟夫环方法决定生死(实际上是所有人抽签,每一轮抽到1的人把抽到2的人杀死),陆续杀死了其余被困者,只有他和另外一人出了山洞投降。

这是一个数学问题,非常适合用计算机编程去解决。

二、 问题描述和解决

有n个人,其编号分别为1,2,3,…,n。这n个人按顺序排成一个圈。现在给定s和d,从第s个人开始从1依次报数,数到d的人出列,然后又从下一个人开始又从1开始依次报数,数到d的人又出列,如此循环,直到最后所有人出列为止。求解约瑟夫问题。

求解方法很多,在此定义一个节点类,采用循环链表结构求解

代码很简单,我觉得算法主要领会思想package com.dong;

import java.util.Scanner;

public class LinkNode {              //单向链表的节点类

public int data;                 //存放节点值

public LinkNode next;            //存放节点值的引用

public LinkNode(int k){         //构造方法 ,值为k的节点

data = k;

next= null;

}

}

class Josephus{

public static void printJosephus(int n,int s,int d){

int i=1;                    //创建长为n的循环列表

LinkNode q,tail;

LinkNode head = new LinkNode(i);

head.next = head ;

tail = head;             //第一个节点,尾巴和头在一起

while(i<>

i++;

q = new LinkNode(i);    //增加一个新节点

q.next = head ;        //节点的引用指向头

tail.next = q;            //最后一个元素的引用指向了q

tail = q;              //那么最后一个元素就是q

}

int j= 0;               //从s开始报数,依次输出出列人的编号

LinkNode p = head;      //计数起点

while(j<>-1){

j++;

p = p.next;

}

while(p.next != p){

j = 1;

while(j<>-1)   //计数的起始点

{

j++;

p = p.next;

}

System.out.print(p.next.data + ' ');  // 输出出列的节点号

p.next = p.next.next;

p = p.next;                                //不断指向下一个节点

}

System.out.print(p.data);

}

public static void main(String[] args){

Scanner input = new Scanner(System.in);

int n = input.nextInt();

int a = input.nextInt();

int b = input.nextInt();

Josephus.printJosephus(n, a, b);

}

}

输出:

约瑟夫环问题java_Java求解约瑟夫环问题相关推荐

  1. 数据结c语言约瑟夫环实验报告,数据结构约瑟夫环实验报告.doc

    数据结构约瑟夫环实验报告.doc 数据结构与算法设计约瑟夫环实验报告实验一专业物联网工程班级物联网1班学号15180118姓名刘沛航一. 实验目的 1.熟悉VC环境,学习使用C语言利用链表的存储结构解 ...

  2. 一步一步求解约瑟夫(Joseph)问题

    约瑟夫(Joseph)问题的解决方法 问题描述 最初Joseph问题是这样的:有n个人(分别编号1,2--n)围成一圈,这些人轮流数数(编号为1的人开始,从1开始数),当数到m的人就会被处决.接着,后 ...

  3. 用java解决约瑟夫循环问题_Java采用循环链表结构求解约瑟夫问题

    本文实例讲述了Java采用循环链表结构求解约瑟夫问题的方法.分享给大家供大家参考.具体分析如下: 这是第一次java考试的试题,对于没看过链表的同学来说就不会做,现在回头看看,还真不难. 约瑟夫问题: ...

  4. 采用循环链表结构求解约瑟夫问题

    这是第一次java考试的试题,呜呼,因为没看过链表就不会做,现在回头看看,真不难. 约瑟夫问题:有n个人,其编号分别为1,2,3,-,n.这n个人按顺序排成一个圈.现在给定s和d,从第s个人开始从1依 ...

  5. 求解约瑟夫(Joseph)问题---Java算法小练

    约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称"丢手绢问题". -百度百科 相信大部分人在刚开始接触Java算法都会遇到约瑟夫问题, ...

  6. 5.12编程求解约瑟夫问题:有12个人排成一圈,从1号开始报数,凡是数到5的就离开,然后继续报数,试问最后一个报数的是谁? 1,2,3,4,5

    1.0 package bookTest3;import java.util.Arrays;public class FivePointTwelve {/*编程求解约瑟夫问题:有12个人排成一圈,从1 ...

  7. 环信集成 2---基于环信Demo3.0,实现单聊功能

    这几天在做环信,所以把环信相关的东西拿过来,做个系统点的东西 注意: 这里Demo集成的是带有实时语音功能的(libEaseMobClientSDK.a). 环信库是直接拖拽EaseMobSDK文件夹 ...

  8. 群签名和环签名的区别_环签名方案的研究

    摘要: 信息时代虽然带给我们无限商机与方便,但也充斥着隐患与危险.由于网络容易受到攻击,导致机密信息的泄密,数据被篡改,轻则引发企业,部门工作陷入瘫痪,个人利益受损,重则危及国家安全和社会稳定,因此保 ...

  9. 判断链表是否有环,并找出入环点☆

    题目:设计一个算法判断一个链表是否有环,并找出入环点 分析:我们可以想象一下,在一个有环的赛道上,有两个人跑步,一个人跑得快,一个人跑得慢,试想,时间充足的情况下,跑得快     的那个人是不是会再次 ...

  10. 锁相环环路滤波器计算公式_锁相环计算方法.doc

    锁相环计算方法 2.理论分析计算与电路设计 2.1 锁相环 2.1.1 锁相环原理 为了使系统产生稳定的载波,本系统设计中采用锁相环路.锁相环路是一种反馈控制电路,将参考信号与输出信号之间的相位进行比 ...

最新文章

  1. WCF for .NET CF的一个应用及两个困惑的问题
  2. CentOS 7下用firewall-cmd
  3. 让我们一起Go(十三)
  4. 行!人工智能玩大了!程序员:太扯,阴谋!你怎么看?
  5. Excel文件读取的两种方式
  6. MVC实战之排球计分(六)—— 使用EF框架,创建Controller,生成数据库。
  7. python基础教程书籍-7本Python必读的入门书籍
  8. python简述程序的ipo结构_python程序流程图
  9. 我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?(建议收藏)
  10. 【echart】常用术语
  11. linux磁盘分区详解
  12. 2.4g低功耗SI24R1校园答题器
  13. Python工程师必备哪些技能 学习路线是什么
  14. 基于 Python 的全国空气质量监测与可视化分析平台
  15. uni-app第三方登录
  16. android ContentValues类
  17. python中db是什么意思_python_面试题_DB相关问题
  18. continue和break跳出多层循环的问题
  19. python循环构建多个类_Python高级特性:Python迭代、生成器、列表生成式
  20. 销售额总和的分类汇总计算机操作,销售数据excel表格分类-如何在EXCEL表格中按类别小计?...

热门文章

  1. latex 中的长度单位,尺寸
  2. ffmpeg实现各种视频特效
  3. jsencrypt php,js加密php解密(一)
  4. MPU9250传感器
  5. Redis 中的 standalone(单机模式)配置说明和分析
  6. PostgreSQL新建数据字段时的怪异现象
  7. 如何把pdf拆分成多个文件?
  8. 纹理特征提取(envi+python)
  9. 如何利用软文营销将好品牌故事?
  10. 电源电流测试软件,如何使用分流器进行测试直流电源电流?