约瑟夫问题的求解!

用循环队列求解约瑟夫环问题 用循环队列求解约瑟夫环问题 大家好,这次我们来求解求解约瑟夫环问题,并对比用循环队列和用普通形式求解之间的不同之处。也欢迎各位大佬指正。 目录如下可快速查阅问题描述循环队列求解算法描述程序清单运行结果普通形式求解算法描述程序清单运行结果对比分析 问题描述 设有n个人站成一圈,其编号为1~n。从编号为1的人开始按顺时针方向1、2……循环报数,数到m的人出列,然后从出列者的下一个人重新开始报数,数到m... 阅读详情

已知有n只猴子(以编号1,2,3,..., n 分别表示)围坐一圈。从第一只猴子开始,按顺序从1开始报数,数到 m 的那只猴子出列;接着再从从 1 开始报数,报数到 m 的那只猴子又出列;依此规律重复下,直到只剩一只猴子为止。输入n和m,输出最后剩下的猴子?

 

此问题,即报数问题,也是约瑟夫问题!

 

    很多人一开始想到是用链表或数组来实现,而这都涉及到模拟整个游戏过程,要将链表或数组变成环形的!

    方法一思路:我们可以假设猴子就位的状态用1表示,把猴子离开的状态用0表示。那么我们就可以用一个a[M]的数组来存放M个猴子是否就位的状态。我们可以一边报数一边遍历该数组,每遇到第K个1时,就把当前位置的1变为0,表示当前位置的猴子已经出局了。一直循环遍历到我们的状态数组只有一个1的时候,这个存放1的数组下标再加上1(因为数组下标是由0开始的,所以要加1)即为选出的大王的编号。

 

当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。

方法二:采用递归思想:我们知道第一个猴子(编号一定是m%n-1) 出列之后,剩下的n-1个猴子组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
  k  k+1  k+2  ... n-2, n-1, 0, 1, 2, ... k-2
并且从k开始报0。

现在我们把他们的编号做一下转换:
k     --> 0
k+1   --> 1
k+2   --> 2
...
...
k-2   --> n-2
k-1   --> n-1

变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)%n

如何知道(n-1)个猴子报数的问题的解?对,只要知道(n-2)个猴子的解就行了。(n-2)个猴子的解呢?当然是先求(n-3)的情况 ---- 这显然就是一个倒推问题!好了,思路出来了,下面写递推公式:

令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n]

递推公式
f[1]=0;
f=(f[i-1]+m)%i;  (i>1)

有了这个公式,我们要做的就是从1-n顺序算出f的数值,最后结果是f[n]。因为实际生活中编号总是从1开始,我们输出f[n]+1

由于是逐级递推,不需要保存每个f,程序也是异常简单:



约瑟夫斯问题的求解方法 约瑟夫斯问题 1. 问题介绍   这个问题是以弗拉瓦斯 约瑟夫斯的名字命名的。约瑟夫斯是一个著名的犹太历史学家,参加并记录了公元66-70年的犹太人反抗罗马的起义。约瑟夫斯作为一个将军,设法守住了裘达伯特的堡垒达47天之久,但在城市陷落之后,他在和40名顽强的战士在附近的一个洞穴中避难。在那里,一些反抗者表决说“要投降毋宁死”。于是,约瑟夫斯建议每个人应该轮流杀死他旁边的人,而这个顺序是是由抽签决... 阅读详情

相关推荐

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

详细介绍了用模拟法和公式法求解约瑟夫(Joseph)问题,并给出了相应的分析

w57w57w57的专栏 4857

约瑟夫问题详解

约瑟夫问题: 有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是? 暴力 题目传送门 暴力都想不到就真是让人折服了。 暴力的话大模拟即可,不是重点,贴份代码就算了。 #include <cstdio> int n,k; struct node{ int x; node *ne...

a_forever_dream的博客 3万+

PTA猴子选大王(约瑟夫环问题)

约瑟夫环问题

日常学习记录、分享,愿我们都遇见更好的自己,与诸君共勉 6644

约瑟夫问题 C++求解

约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,其表述方式有多种,较典型的一种是: 有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。 解法一:数组求解 根据输入的n值确定数组的长度...

MilkLeong的博客 1万+

约瑟夫问题求解算法的设计与实现

一、实验内容 约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 二、实验目的 掌握

u011446963的博客 3510

缠中说禅交易指南

战胜市场,其实就是战胜自己的贪婪、恐惧、愚蠢,缠中说禅技术分析理论只是把市场拔光给各位看,而拔光一个人并不意味着就等于征服一个人,对于市场,其道理是一样的。不干,不可能征服市场。对于市场来说,干就是一切。技术分析的最终意义不是去预测市场要干什么,而是分析市场正在干什么,是一种当下的直观。在市场上所有的错误都是离开了这当下的直观,用想象、用情绪来代替。 市场是有规律的,但市场的规律并不是显而易见的,是需要严格的分析才能得到。更重要的是,市场的规律是一种动态的,在不同级别合力作用下显示出来的规律,企图用些单纯的

baidu_25764509的博客 2万+

约瑟夫环问题详解

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

tingyun_say的博客 14万+

保姆级教程:在RK3588开发板上驱动多路MIPI摄像头(从VICAP配置到ISP调优)

本文详细介绍了在RK3588开发板上驱动多路MIPI摄像头的完整流程,从VICAP配置到ISP调优的全方位解析。通过硬件架构分析、开发环境搭建、设备树配置、V4L2数据采集以及ISP图像调优等步骤,帮助开发者高效实现多路摄像头驱动,适用于工业检测和智能安防等领域。

weixin_42552315的博客 380

约瑟夫问题及求解方法

队是一种特殊的线性表,它只允许在一端进行插入,在另一端进行删除,允许插入的一端称为队尾,通常用一个队尾指示器指向队尾元素;允许删除的一端称为排头,用一个排头指示器指向排头元素。在队列中,最先插入的元素将最先删除,因此又称队为先进先出线性表。n个人围坐在圆桌周围,从某个人开始编号为1,2,3,4,…,n,编号为1的位置上的人从1开始报数,数到m的人出列,从下一个人又从1开始报数,数到m的人便是第二个出列的人。如此重复下去,直到最后一个人出列为止。

z135733的博客 3687

雷电模拟器+Python 3.11:手把手教你用Frida-dexdump给安卓APK脱壳(附GDA查壳)

本文详细介绍了如何使用雷电模拟器和Python 3.11配合Frida-dexdump工具进行安卓APK脱壳的全流程。从环境配置、工具安装到脱壳操作和问题排查,提供了包含30+关键截图的保姆级教程,适合零基础用户快速上手。重点讲解了Frida工具链的使用技巧和GDA查壳方法,帮助读者掌握移动应用安全分析的基础技能。

weixin_42568801的博客 319

银河麒麟服务器操作系统V10 SP1:跨架构激活与设备更换无忧指南

本文详细解析了银河麒麟服务器操作系统V10 SP1的跨架构激活新特性。该特性彻底解除了授权与CPU架构的绑定,允许同一份授权在x86、ARM、龙芯等不同架构服务器间灵活使用。文章提供了从新设备激活到硬件更换后保持激活状态的全流程实战指南,并分享了内网环境部署等高级技巧,助力企业简化运维、提升硬件资源管理灵活性。

ff678的博客 337

约瑟夫环排列问题

年轻是我们唯一拥有权利去编织梦想的时光!💓💓💓 文章目录1、问题背景2、问题描述3、问题分析4、分文件源码分析5、整体代码 1、问题背景 2、问题描述 Josephus排列问题:对于给定的1,2,3,…,n中的k个数,Josephus想知道是否存在一个正整数m(m≤n),使得Josephus(n,m)排列的最后k个数恰好为事先指定的k个数。例如当n为7,k为4,指定排列的最后k个数为7,5,1,4时;由于(7,3)Josephus排列为3,6,2,7,5,1,4;所以求得m值为3。 3、问题分析 ...

forever的博客 3372

从原理到接法全面了解三相电

从原理到接法全面了解三相电

viixin的博客 1万+

使用python列表的求解约瑟夫环问题

约瑟夫环问题是数学和计算机科学中的一个经典问题,详见约瑟夫问题百度词条。之前在计算机二级考试中遇到过,当时用C语言写的,感觉有点复杂。现在学习python,发现可以用列表的pop方法完美模拟把人移除的操作,因此重新用python写了一下: 问题的具体描述:有34个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 python代码: r...

weixin_41855010的博客 6915

AI气象预报:数值模式融合与短临预警的工程实践

气象预报正经历从物理推演到数据驱动的认知范式转变。AI气象预报并非替代传统数值模式,而是通过数值模式融合弥补其在参数化误差、初值敏感性和计算效率上的固有瓶颈。其技术价值在于提升短临预警时效性与空间精度,支撑航空调度、电力调控、防洪应急等关键场景。实践中需兼顾物理一致性、可解释性与业务系统兼容性,避免纯黑箱建模带来的外推失效与不确定性缺失风险。本文聚焦AI作为超分辨率引擎、误差矫正器和短临加速器的三类落地路径,解析HEALPix投影、多尺度图建模、轻量级U-Net等核心适配方法。

weixin_28221501的博客 287

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 461

Java 求解约瑟夫环问题

无意中看到这个约瑟夫环问题问题,觉得挺有意思的,然后用Java编程求解一下。 题目要求: n个人围成一圈,从第一个人开始报数,数到K的人出局,然后从下一个人接着报数,直到最后一个人,求最后一个人的编号,或者计算出出圈顺序。 解法一: public class Josephus { /* * "约瑟夫环"问题的解决方法1 * 共N个人,从第S个人开始报数,报数1—M * 这里初始化...

格子小七的个人博客 3600

从零开始:用Kimi API和LangChain打造智能写作助手

本文详细介绍了如何从零开始,利用Kimi API提供的强大AI大模型能力,结合LangChain框架构建一个智能写作助手。通过实战演示了环境搭建、核心写作链构建、以及引入检索增强生成和智能体等进阶功能,旨在解决长文档创作、事实准确性等痛点,打造一个能理解意图、调用工具并保持记忆的智能创作伙伴。

weixin_29294395的博客 130

C语言中约瑟夫问题的求解思路

具体来说,在这个问题中,有 `n` 个人围成一圈,从第一个人开始报数,每报到第 `m` 个人就将其淘汰,然后从下一个人重新开始报数,直到只剩下最后一个人为止。- 如果 `count` 不等于 `m`,则只需移动 `prev` 和 `pcur` 到下一个位置,并增加计数器 `count`。- 函数 `buyNode` 用于创建一个新的链表节点,并初始化其值为 `x`,同时将下一个指针设为 `NULL`。- 最后返回尾节点 `ptail`,它的 `next` 指向头节点 `phead`,完成闭环。

z939188380的博客 1328

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

约瑟夫问题求解

约瑟夫(Josephus)问题:n个人围城一圈,从1开始顺序编号;游戏开始,

Strugoogle的专栏 669

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

一道会反向的约瑟夫问题解法

主要针对约瑟夫问题,以及一道会反向的变种约瑟夫问题“春樱对决”的数学推导过程的解题笔记

still_wtm的博客 3272

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【算法】约瑟夫环问题

链表算法篇

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

约瑟夫问题求解及进一步思考

借助数组的抽象结构,给出了约瑟夫问题的具体求解,并在此基础上对逆向求解给出了自己的思考

clear_king的博客 435

求解约瑟夫环问题

转载: https://blog.csdn.net/tingyun_say/article/details/52343897 一、约瑟夫环介绍 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后杀死所有人。 于是约瑟夫建议:每次由其他两人一起杀死一个...

qq_30534935的博客 1249

2种方法求解约瑟夫环问题

问题:n个人围成一圈缝m报数,数到m的出列,后面的人开始继续从1开始,数到m的出列,问最后剩下的一个人的序号是多少。   一.循环单链表求解 //循环队列求解约瑟夫问题 #include #include typedef struct student { i

ERIC的编程之路 2400
上一篇: 一道小程序题!
下一篇: 第四章学习笔记
heavenbuy
博客等级 码龄19年 0粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值