约瑟夫环问题

约瑟夫环(Josephus Circle) 约瑟夫环(Josephus Circle)是一个数学的应用问题:已知 n 个人(分别用编号 0, 1, 2, ..., n - 1 表示)围坐在一张圆桌周围。从编号为 0 的人开始报数,数到 m 的那个人出圈,他的下一个人又从 1 开始报数,数到 m 的那个人又出圈,依次规律重复下去,直到剩余最后一个胜利者。 阅读详情

约瑟夫环问题

@(算法)


问题描述与解决

Josephus的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。

下面使用数组遍历计数的方法解决约瑟夫问题:

public class JosephProblem {
	
	public static void main(String[] args){
		josephusStory();
		System.out.println();
		System.out.println();
		System.out.println("------------------------------------");
		System.out.println();
		gaspardStory();
	}
	
	public static void josephusStory(){
		// true:自杀了
		// false:或者
		boolean[] menInCave = new boolean[41];
		
		// 自杀计数指针,只数活人
		int suicidePointer = 0;
		// 留下的人数计数
		int menAlive = menInCave.length;
		// 步数计数
		int count = 0;
		
		while(true){
			if(count == menInCave.length){
				count = 0;
			}
			if(!menInCave[count]){
				suicidePointer++;
			}
			if(suicidePointer == 3){
				menInCave[count] = true;
				menAlive--;
				suicidePointer = 0;
			}
			if(menAlive == 2){
				break;
			}
			count++;
		}
		
		// 打印时位置编号
		int num = 1;
		for (boolean man : menInCave) {
			System.out.print(num+":"+ man+" ");
			num++;
		}
	}
	
	public static void gaspardStory(){
		// true:被扔下海
		// false:活着
		boolean[] menOnBoat = new boolean[30];
		
		// 杀人计数指针,只数活人
		int killPointer = 0;
		// 留下的人数计数
		int menAlive = menOnBoat.length;
		// 步数计数
		int count = 0;
		while(true){
			if(count == menOnBoat.length){
				count = 0;
			}
			if(!menOnBoat[count]){
				killPointer++;
			}
			if(killPointer == 9){
				menOnBoat[count] = true;
				menAlive--;
				killPointer = 0;
			}
			if(menAlive == 15){
				break;
			}
			count++;
		}
		
		// 打印时位置编号
		int num = 1;
		for (boolean man : menOnBoat) {
			System.out.print(num+":"+ man+" ");
			num++;
		}
	}
}

约瑟夫问题背后的故事

引用的原文出处

计算机专业的学生大都知道约瑟夫环问题。

n个人(编号1…n)围成一圈,选择一个正整数k,从第一个人开始从1报数,报到k的人被拉出圈外,在剩余的人中,从被拉出去那人下一个人开始,继续从1开始报数,报到k的人再被拉出圈外。如此循环,直至剩下最后一人。所以,对于每给定一组n和k,可以算得一个编号序列,序列中编号的位置表示这个人被拉出圈外的顺序。

这是一个数学问题,非常适合用计算机编程去解决。所以,它经常作为一道编程练习题,出现在各种计算机编程语言教材当中。之所以叫约瑟夫环,因为相传是由犹太历史学家约瑟夫(公元37-100)最先提出来的。

公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中。罗马将军韦斯巴芗(Vespasian)派人来劝降,他主张投降,其余的人不答应,并以死相逼。最后,约瑟夫提议,与其死在自己的手上,不如死在彼此的手上。据说,他提出用约瑟夫环方法决定生死(实际上是所有人抽签,每一轮抽到1的人把抽到2的人杀死),陆续杀死了其余被困者,只有他和另外一人出了山洞投降。这个事件也反应了那个时代犹太人悲惨的状况。当他被带到韦斯巴芗面前时,因为当面预言韦斯巴芗会成为罗马皇帝,所以免于牢狱之刑。后来这个预言果真应验了,于是,他托庇于韦斯巴芗门下,并取得了罗马公民身份。在提图斯(韦斯巴芗的儿子)于公元70年摧毁耶路撒冷圣殿之后,他移居于罗马。因为这些经历,他常被指责为叛徒。

但是,约瑟夫是公元一世纪重要的历史学家,主要著作有《犹太古史》和《犹太战记》。再由于他生活于1世纪(和使徒时代相当),是距离耶稣基督时代最近的历史学家。所以,他关于犹太历史的描述常作为《圣经》里记述史实的重要佐证和参考。《犹太古史》里关于希律家族、施洗约翰、大祭司、犹大巡抚(彼拉多、腓力斯、非斯都)等记述都与《圣经》<福音书>和<使徒行传>相印证,有些内容互相补充。例如,关于施洗约翰的被捕入狱和《圣经·马太福音》一致,并且约瑟夫给出了施洗约翰被囚禁和杀害的地点。再如,关于希律亚基帕演讲时暴毙的史实,《圣经·使徒行传》12章记载,希律面对听众谄媚,没有归荣耀给神,被主的使者所罚,以至于被虫所咬而亡。而《犹太古史》里面也有相关记载,并且给出了详细的过程描述。《犹太古史》从另一个视角给《圣经》部分内容提供了证据,证实了《圣经》记载的正确性。

耐人寻味的是,在《犹太古史》里面也有关于耶稣基督的记述,里面这样记述:此时,有一位智者,名叫耶稣,他有佳美的言行,并因为自己的德行而著称。在犹太及其他民族中,有许多人跟从耶稣,作了他的门徒。彼拉多将他定罪,并把他钉死在十字架上。然而,那些已经成为耶稣门徒的人,并没有因此背弃自己门徒的身份。他们宣称说,耶稣在被钉死在十字架上的第三天向他们显现了,耶稣已经复活了。因此,耶稣可能就是那位弥赛亚。众先知已经就他做出了奇妙的预言。而且,那些因为耶稣基督得名的基督徒们,迄今为止仍然没有消失。引自《约瑟夫著作精选》,北京大学出版社。

从这份描述可见,在使徒时期,耶稣基督的名声并没有因为被钉十字架而削弱。相反地,在耶稣的感召下在,经过使徒们的不懈努力,基督复活的福音正迅速传播。从犹太地,到撒玛利亚,再到亚细亚,非洲,欧洲等等。约瑟夫是一位犹太人,能做出如此评价,可见耶稣对那个时代影响之深。这种影响不仅是因为对耶稣所行诸多神迹的耳闻目睹,还包括众门徒所做的基督复活见证。耶稣基督复活之后曾多次向多人显现,最多一次是同时向500人显现(哥林多前书15:6)。

约瑟夫环问题 - Python 基本问题描述: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。(也类似于变态杀人狂问题)通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。通常,我们会要求输出最后一位出列的人的序号。那么这里主要研究的是最后一个出列的人的序... 阅读详情

相关推荐

SAP高级外币评估_FINS_FXV_S4 2022 OP

摘要:S/4HANA 2022 On-Premise中的高级外币评估(FINS_FXV)取代了经典外币估值(FAGL_FCV),提供更优化的财务结算功能。主要创新包括:增量发布逻辑、简化账户配置、行项目级估值可见性等。该功能支持IFRS9等会计准则,通过会计原则(Accounting Principle)进行配置,需完成财务报表版本定义、语义标记分配等必要设置。系统演示展示了从汇率维护(FB60/MIRO)、测试运行到最终过账(FB03)的完整流程,能自动计算并过账汇率差异。高级外币评估简化了期末结算操作,

yanzibing99的博客 1258

约瑟夫问题(Josephus problem)详解

约瑟夫问题 1)设编号为 1,2,3 ... n 的 n 个人围坐一圈。 2)约定编号为 k (1 <= k <= n)的人从 1 开始报数,数到 m 的那个人出列。 3)它的下一位又从 1 开始报数,数到 m 的那个人又出列,依此类推,直到所有人出列为止。 4)由此产生一个出列编号的序列。 解题思路 1)构建一个结构体 Boy No 为 Boy 的编号。 Next 指针指向下一个 Boy。 代码如下: // 小孩的结构体 type Boy struct {...

XPiedPiperX的博客 1万+

CMap与L1000技术解析:基因表达数据在药物发现中的应用

本文深入解析了CMap(连接图)与L1000技术在药物发现中的核心应用。CMap通过构建基因表达“关系网”,实现基于模式匹配的药物重定位;L1000技术则以低成本、高通量方式生成关键基因表达数据,支撑了LINCS超级数据库。文章以CLUE平台为例,手把手演示了如何利用疾病基因表达签名逆向筛选潜在治疗化合物,并拓展了其在解析药物机制、预测副作用等多场景下的价值。

weixin_29207533的博客 726

【数据结构】约瑟夫问题

已知n个人(以编号1,2,3,…,代表)围坐成一圈。现在从编号为k的人开始报数,数到m的人出列;他的下一个人又从1开始报数,数到m的人又出列;依此重复下去,直到所有人全部出列。

lsj的博客 8222

FRM(Financial Risk Manager,金融风险管理师)知识点总结归纳

FRM知识点总结(150字) FRM考试分为两级:一级侧重基础理论和工具,包含风险管理基础、定量分析、金融市场产品、估值与风险建模四大模块,涵盖风险管理框架、统计学方法、衍生品定价及VaR计算等核心内容。二级聚焦实际应用,分为市场风险、信用风险、操作风险、流动性风险、投资管理和市场前沿六大模块,深入探讨高级风险度量技术(如极值理论)、信用风险模型、巴塞尔协议及新兴风险议题。考试体系贯穿"风险识别→度量→管理→监管"逻辑主线,强调定量分析与实务案例的结合,覆盖传统金融风险和区块链、ESG等

极客神殿 1440

Visual Studio 2022 社区版安装指南:从下载到配置的完整流程

本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。

weixin_28829339的博客 873

Josephus问题(约瑟夫环)

这里将其中一种: 问题描述:     一堆猴子都有编号,编号是1,2,3 …m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 输入:     m,n. (m, n<10000) 输出:     大王的编号 模拟实现的代码: #include <iostream> #incl...

nowting的博客 5439

RDKit | 基于Murcko骨架聚类化合物库

化合物多样性评估 一种方法是使用合适的指纹技术将化合物矢量化并评估他们之间的距离。这种方法经常被使用,但是对于人类很难直观地理解化合物之间的距离。 基于Murcko骨架,分子大致聚集在化合物骨架中,并且每个簇中的顶部化合物都作为候选化合物。此方法非常符合人类的直觉,因此可以预期人将通过查看候选化合物列表来自动缩小化合物的范围。 Murcko骨架 Mur...

DrugOne 3765

josephus问题

Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个人出列,然后从出列的下一个人处重新开始报数,数到第m个人又出列,……如此反复直到所有的人全部出列为止。对于任意给定的n、s和m,求按出列次序得到的n个人员的序列。 基本要求: (1)熟悉将算法转换为程序代码的过程。 (2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的描述方法。 (3)熟悉掌握顺序表的基本运

Moeyinss 3243

微信小程序 - 最新详细实现用户保存下载视频到手机相册,将视频临时路径、在线播放地址(网络路径)URL存储到手机,弹出访问手机相册权限询问,支持视频格式mp4、avi、mov、wmv、flv、webm

微信小程序,视频,手机相册,保存,另存为,小程序保存到相册权限,writePhotosAlbum,一键保存视频到手机相册功能(视频来源为链接),第一次要获取用户授权,授权使用相册权限,小程序视频下载,如何把视频下载到相册,下载一个视频到本地相册,显示下载进度,可取消下载,视频下载到本地,微信小程序视频如何下载,保存视频到相机,页面播放视频并下载到本地,安卓系统,苹果ios保存到相册报错,权限拒绝后打不开,添加相册授权弹框拒绝后再也出不来了,实现保存视频到手机相册功能,将mp4在线视频下载并存储到用户的手机中

🏆 前端领域优质创作者 7620

【OS】AUTOSAR OS Alarm实现原理

AUTOSAR OS Alarm实现原理

qq_36056498的博客 1022

约瑟夫环问题详解

在牛客网上做到一道题,是约瑟夫环的变型,所以借此学习一下新知识,并且巩固一下对题目意思的理解,这一篇仅作约瑟夫环问题的解释,下一篇再写题目: 1.首先,我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后杀...

tingyun_say的博客 14万+

使用MATLAB结合EasySpin进行ESR模拟的详细步骤及示例代码

安装EasySpin:确保你已经安装了EasySpin工具箱,它可以帮助你进行ESR模拟。你可以从EasySpin的官方网站(https://easyspin.org/)下载并安装。准备实验数据:将实验得到的EPR数据整理成合适的格式,一般包含磁场(Magnetic Field)和信号强度(Intensity)两列。进行模拟:使用EasySpin的函数对单线态氧自由基和超氧自由基进行模拟。调整参数:通过调整模拟参数,使模拟得到的峰型和峰位置与实验数据尽可能匹配。导出数据。

AI的内部世界的博客 2004

【算法】约瑟夫环问题

链表算法篇

博客网站地址: https://arsenova.xyz 我会将优快云上的博客重修一部分迁移到网站上。 文章会做同步更新,但我不会在这个糟糕的平台多待1秒。下面是我要说的话,save your time. keep going 1389

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

约瑟夫环问题 python

约塞夫环问题原理python代码特点 原理 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.) 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一...

。 575

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python 约瑟夫环问题

为什么80%的码农都做不了架构师?>>> ...

weixin_33712881的博客 1505

openjudge 约瑟夫环问题

1:约瑟夫环问题 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 1000kB 描述 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 输入 8 1 3 (n=8 k...

pxlsdz的博客 839

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 /** * @author 16026 * */ import java.util.ArrayList; import java.util.List;

wangzhen的博客 3万+
上一篇: Java EE设计模式 Spring企业级开发最佳实践(第一章)
下一篇: (不更新了...)Java EE设计模式 Spring企业级开发最佳实践
empty0.0
博客等级 码龄19年 20粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值