约瑟夫循环报数问题

每日一题--20200408--约瑟夫环问题:已知n个人围成一圈(编号:1,2,3,…,n),从编号为1的人开始报数,报数为m的那个人出列;从他的下一个人又从1开始数,同样报数为m的人出列;依此循环下 已知n个人围成一圈(编号:1,2,3,…,n),从编号为1的人开始报数,报数为m的那个人出列;从他的下一个人又从1开始数,同样报数为m的人出列;依此循环下去,直到剩余一个人。求最后这一个人在最开始的序列中编号是几号? #include <stdio.h> int main ( ) { //1 int n,m,out = 0,count = 0; printf("n =... 阅读详情

    约瑟夫循环问题,根据http://blog.youkuaiyun.com/ZCSYLJ/article/details/6830703的文章写出自己的一些心得体会。

   首先在一个序列中,假如该序列有n个元素,并且以m报数。假设给这个序列进行编号,第一个为0,第二个为1.......则这个序列就是0,1,2,3,........n-1

   那么第一个出来的人必然是m%n-1。之后便是一个思维的关键点,我们把m%n-1之前的数移到最后面并且去除m%n-1这个元素从而组成一个新的序列。

   为什么要把之前的元素转移到后面呢?

   因为这是约瑟夫循环算法的一个必须条件,没有此条件不能完成下面我要说的一个循环。不妨假设在这一步中,只剔除m&n-1这个元素。之后继续进行报数,虽然这样也是可行的,但是会造成许多的麻烦,原本的2去除,之后需要去除5,之后是8.......并且这样一来你去掉的那个数字所在的位置要怎么办的,是要以0代替?还是什么别的?由此一来便十分困难,所以当元素转移之后,每次都是编号为2的元素剔除(不包括最后几次)。

  之后我们需要对这个序列进行重新编号,原来的编号是:m%n,m%n+1,m%n+2,.......n-1,0,1,2,......m%n-2。

  现在的编号是                                                                   :0,1,2,3,4...........n-2。

  在这里考虑m%n是考虑到m>n的情况

  之后重复按照先前的两个步骤循环就可以得到最后一个只有一个数字的序列,而这最后一个序列就是你想得到的结果。

  所以这就是一个数学的关于J[n]与J[n-1]之间的关系。并且已经知道了J[0]必然是等于0的。所以现在必须知道J[n]与J[n-1]之间的关系到底是什么。(J[N]代表最终只剩下一个人该人的编号)

  经过递归我们知道了,由于在转移之前,剔除的数的后一个数现在的编号是0,之前的编号是m%n,所以J[n-1]+m%n=J[n]。考虑到原编号为0之后的情况,需要(J[n-1]+m%n)%n。所以得到了J[n]=(J[n-1]+m%n)%n。这个函数说白了就是一个编号转换的函数。其实大家如果看不懂这个函数时,往往都以为是这个函数是解出这题的关键点,其实不然。愚以为把元素放到后面的这个做法才是最重要的:把一部分元素放到后面,之后重新编号,递归。这才是这个约瑟夫循环报数的精华思想。

  所以下面就可以附上代码了:

#include<iostream>

using namespace std;

int main()

{

int m,n;cin>>m>>n;

int sum=0;

for(int i=2;i<=n;i++)sum=(sum+m%i)%i;

cout<<sum+1;//考虑到实际问题第一个人的编号一般不是0而是1

}


 

华为OD最新机试真题-池化资源共享 摘要:该问题要求管理n台设备的资源池,处理资源申请和释放操作。申请操作需返回满足条件且剩余资源最少的设备ID,释放操作需将指定申请的资源归还。采用线段树数据结构维护各设备当前最大可用资源值,支持快速查询和更新。线段树实现了单点修改、区间最大值查询以及查找最左满足条件的节点功能。算法时间复杂度为O((n+m)logn),空间复杂度O(n),适用于大规模操作。提供了C++、Java和Python三种实现方案。 阅读详情

相关推荐

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2206

约瑟夫问题

问题描述 Josephu(约瑟夫、约瑟夫环) 问题 Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类 推,直到所有人出列为止,由此产生一个出队编号的序列。 举个例子 n = 5 , 即有5个人 k = 1, 从第一个人开始报数 m = 2, 数2下 经过一次出圈后 第二次出圈 第三次出圈 第四次出圈 所以最终的出..

qq_45796208的博客 2951

告别枯燥的Unity编辑器脚本:Odin插件如何让游戏数据配置变得像搭积木一样简单?

本文详细介绍了Odin插件如何简化Unity编辑器脚本开发,使游戏数据配置变得直观高效。通过声明式特性和丰富的可视化工具,Odin让开发者告别繁琐的OnGUI代码,实现所见即所得的开发体验。文章重点展示了Odin的核心优势、魔法特性及实战案例,帮助Unity开发者提升工作效率。

weixin_28717411的博客 345

约瑟夫问题_公式原理详解

每次增加一个人,我们第一轮的报数被指定的必定是新加入的人。

小黯 3万+

手把手教你搭建离线语音助手:FunASR+DeepSeek+TTS保姆级教程

本文详细介绍了如何利用FunASR、DeepSeek和TTS技术搭建离线语音助手系统。从环境配置、模型部署到唤醒词检测优化、语音识别与语义理解联调,再到语音合成与系统集成,提供全链路实战教程。特别适合智能家居控制、企业内部知识问答等需要数据隔离的场景,实现高响应、低延迟的离线语音交互体验。

weixin_30316097的博客 475

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

ccf题目;游戏(C语言/C++100分代码)

问题描述 试题编号: 201712-2 试题名称: 游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。   游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一...

weixin_38858749的博客 992

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

AI人人懂 2168

LeetCode 报数

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1被读作"one 1"("一个一") , 即11。11被读作"two 1s"("两个一"), 即21。21被读作"one 2", "one 1"("一个二","一个...

qq_41353167的博客 498

Android Camera MTK框架

Camera简介: 虽然前文说道Android在5.0之后就推出了Camera2 API,但是各个厂家的基本未适配,导致目前市场上大部分机型使用的仍然是Camera1 API。PS:Android 9.0 Google强制要求各个平台厂商(高通/MTK/华为等)支持Camera2,不再兼容Camera1。 ...

weixin_49303682的博客 5507

使用conda环境python3.13和python3.12下安装vllm过程记录

使用conda环境python3.13和python3.12下安装vllm过程记录

没刮胡子的程序员专栏 885

循环报数问题

/*有N个人按照1到N编号围成一个圈做游戏,从第一个人开始从1报数,数到M的人退出游戏,他后面的人接着重新从1开始报数.问最后剩下的人是几号?这个问题被称为约瑟夫(josephus)环问题。最容易想到的方法是用一个循环链表来模拟游戏,直到最后只剩下1人.则可得到他的号码.这种算法的空间复杂度是 O(N)时间复杂度是 O(N*M)下面给出一种算法,空间复杂度为 O(1),时间复杂度为 O(N)这

双杯献酒的专栏 3113

【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录

最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2万+

软件开发笔试心得一:循环报数,圆圈报数,约瑟夫问题

最近一段时间一直在找工作,没有心思写心得。今天刚好从淳中视讯面试回来,有一道题很有意思。 1. n个人围成一个圆圈,从1到3开始报数,报到3的人出去,这样一直循环,直到只剩下一个人。问剩下的人在开始报数之前的编号?   当时我想的是直接用循环链表来模拟整个报数的过程,即构造一个n个数的循环链表,进行循环遍历,每当数到3时删除当前指向的节点,直到剩下最后一个。 但是该算法比较复杂,肯定还有简

wzdark的专栏 3528

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

约瑟夫问题C语言实现——N个人排成一队循环报数,报M的倍数的出列,最后剩下的的是原来队列的第几位

题目1,假设有30个人,没人轮流循环报数,当报到9的倍数的人出列,剩下的继续,问最后剩下的1个人是原来的第几号? 代码如下 /* * @Date 2019-09-04 * @Author krisfan * @Description N个人排成一队循环报数,报N的倍数的出列,最后剩下的的是原来队列的第几位 */ #include <stdio.h> #define N ...

weixin_41559101的博客 2548

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

约瑟夫环->循环报数问题

约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分。因此船长告诉乘客,只有将全船 一半的旅客投入海中,其余人才能幸免于难。无奈,大家只 得同意这种办法,并议定30 个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从 他的下一个人数起,数到第9人,再将他投入大海中,如此 循环地进行,直到剩下 15 个游客为止。问:哪些位置是将 被扔下大海的位置...

Time Will Tell 1461

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

小孩报数问题(循环链表)_约瑟夫

小孩报数问题(循环链表) TimeLimit:1000MSMemoryLimit:65536K 64-bit integer IO format:%lld Problem Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列...

weixin_30747253的博客 473

数据结构课程设计(一):约瑟夫环报数问题(C语言单向循环链表实现)

题目要求 编号是1,2,…,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。 要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。 测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确

SSnTi的博客 2651

用Python实现约瑟夫问题:35人围成一个圈子进行循环1到8报数,报数为8的人就淘汰出圈子,然后被淘汰人的下一个接着从1开始循环报数,直到剩下2人位置

用Python实现约瑟夫问题:35人围成一个圈子进行循环1到8报数,报数为8的人就淘汰出圈子,然后被淘汰人的下一个接着从1开始循环报数,直到剩下2人位置 def test(ren,count=0): a = len(ren) b = count for i in ren: b += 1 if len(ren) == 2: return ren if b % 8 == 1: b += 1 ren.remove(i) print(ren) count += a return test(ren,count) re

寒凡 642

循环队列解决(报数)约瑟夫环问题

有n个人围成一圈,从第1个人开始,1,2,…,m报数,报至m出局,余下的人继续从1,2,…,m报数,重复之前的流程,要求:求出被淘汰编号的序列,及最后剩下的一人是原来的第几号? 例如: 输入 10 输入 3 输出 3 6 9 2 7 1 8 5 10 输出 4 算法思路: 由于报数方法相当于一个环,所以可以用循环队列来解决,循环队列相当于一个数组,每出队一个人,就让出队后边的数组向前移动一位,最后留下的那个人一定位于数组第一位。 #include <stdio.h> #include .

m0_61179326的博客 3357

【C语言】单向循环链表(实例详解约瑟夫问题)

类似单链表,循环链表也是一种链式的存储结构,由单链表演化而来。 单向循环链表来源于单链表,所以单链表的基本操作基本都适合于循环链表。两者的不同点主要表现在链表的建立和链表表尾的判断。 接下来我们通过分析一个经典的问题即 “ 约瑟夫问题 ”来理解单循环链表。 “ 约瑟夫问题 ” 简单来说就是:有n个人围成一个圈,规定一个数字num,从某个人开始报数,每次从1报到这个数字num,报到num的人出列,现在要我们按顺序输出...

m0_60511809的博客 4595

Java用循环链表解决约瑟夫环问题(循环报数)

题目描述:输入1个数字和多个字符,中间均以空格隔开。假设数字范围为m(1-9),后面字符个数为n。假设n个字符围成一圈,从第一个字母开始循环报数,当数到m以后,第m个字符就出列,知道这n个字符全都出列。最后按照出列的顺序输出这些字符,中间仍以空格隔开。取值范围:m为1-9,n为1-20。 样例输入:3 a b c d e f g h i 样例输出:c f i d h e b g a

快乐很伟大 1772

3————循环数组实现约瑟夫(报数出圈)问题

package 数据结构; /* * * 约瑟夫问题: * * 设编号1、2、3...n的n个小孩围坐一圈,约定编号为k的人从1开始报数,数到m的人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推 * 直到所有人出列位置,由此产生一个出队的编号序列 * (first指向第一个结点)一开始的单个结点保持环形的性质——自反 * 添加一个结点:创建一个辅助指针,next指向新结点,新结点next指向起始结点,这样就保证了环形性质 * 每次操作后将辅助指针后移一个结点(这个指针用来

qq_45772415的博客 448

C语言指针实现循环报数问题(简单约瑟夫环问题)

题目描述: 报数:有n个人围成一圈,按照顺序从1到n编好号。从第一个人开始报数,报到x(x&gt;1)的人退出圈子,下一个人从1开始重新报数,报到x的人退出圈子。如此下去,直到留下最后一个人。问留下来的人的编号。试编写相应程序。 分析:利用指针的赋0后的特性解决, 赋0,即空指针,就是不指向任何对象,相当于 NULL地址为0的地址是不允许读写的,这是操作系统的保护机制, 所以约定用地址0...

qq_16546829的博客 1万+

JAVA:循环删除数字------------游戏中的循环报数退出问题------- 约瑟夫环问题

问题:循环报数游戏,有n个人,每一个人编号从1开始,依次编号到n.从1到3报数,报3的退出游戏,得出最后获胜人的编号。 问题分析:1.“循环”问题的处理         取余操作                   2.报3的退出                                   a.表示退出          需要一个数来表示该编号的人不能再参与游戏,这里我用的是-1表示...

颠沛的小丸子 1020

约瑟夫问题——C语言实现

约瑟夫问题 约瑟夫问题简述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 [1] 结果+1即为原问题的解。 代码实现 #include <stdi...

可爱的LYF的博客 1万+
上一篇: Pascal的旅行
下一篇: hanooi汉诺塔递归问题
scanferror
博客等级 码龄9年 6粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值