首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

约瑟夫的问题?(具体数学)

约瑟夫的问题是一个经典的数学问题,也被称为约瑟夫环问题。问题的描述如下:假设有n个人围成一圈,从第一个人开始报数,报到m的人出列,然后从下一个人开始重新报数,再次报到m的人出列,如此循环,直到所有人都出列。问最后剩下的人在原始序列中的位置是多少?

这个问题可以通过数学推导和递归算法来解决。数学推导的结果是,当n和m固定时,最后剩下的人在原始序列中的位置可以通过以下公式计算得出:

f(n, m) = (f(n-1, m) + m) % n

其中,f(n, m)表示n个人中最后剩下的人在原始序列中的位置,%表示取余运算。当n=1时,f(n, m)的值为0。

约瑟夫的问题在实际应用中并不常见,但它可以帮助我们理解数学推导和递归算法的思想。在编程中,可以使用递归算法来解决约瑟夫的问题,具体步骤如下:

  1. 定义一个递归函数,传入参数为当前人数n和报数的m。
  2. 当n=1时,返回0,表示最后剩下的人在原始序列中的位置为0。
  3. 当n>1时,调用递归函数计算n-1个人中最后剩下的人在原始序列中的位置,记为x。
  4. 根据公式f(n, m) = (x + m) % n,计算出n个人中最后剩下的人在原始序列中的位置,并返回结果。

这样,我们就可以通过递归算法解决约瑟夫的问题。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送):https://cloud.tencent.com/product/umeng
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云虚拟专用网络(VPC):https://cloud.tencent.com/product/vpc
  • 腾讯云安全产品(云安全中心):https://cloud.tencent.com/product/ssc
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

约瑟夫问题与魔术(二)——数学结构解析

在上一篇文章中,我们聊到了约瑟夫问题定义,以及其用环数学模型来建模,最后用循环单链表数据结构解决该问题等内容。...这些只是基本内容,当我们有了数学模型把这个问题变成数学问题以后,就可以在数学结构内去研究更多东西,而不局限于仅仅求出最后那个被杀的人,比如: 在约瑟夫问题中,我们还可以关心几个内容: 1....被移除节点顺序如何? 2. 最后一个以及倒数若干个留下节点编号是多少? 本质上,我们希望对约瑟夫问题更细致地每一步到底发生了什么进行更细致观察。...具体就是,到底一个原始环上元素,是以怎样排列顺序给移出去,有怎样规律,这个搞清楚了,其他问题都是这个问题问题,包含于此。...接下来,我们再仔细分析一下约瑟夫问题过程,看看这个结论为什么会成立。 约瑟夫问题通项公式理解 原始约瑟夫问题每一步仅往后处理一个人,这也是前面代码模拟思路。

64630

约瑟夫问题与魔术(三)——终极数学推导

前面文章我们介绍了约瑟夫问题,并给出了基本数学模型,和其内部数学性质分析。...今天我们接着上期问题分析把整个过程数学细节都描绘下来,注意今天描绘粒度是每一次对整个序列遍历,而第一篇描述时候是每一次行动。...所以这个函数恰好可以用高斯函数表达: f(n, k) = [k / (k - 1)((f(n’, k) - n % k)mod n’)] 于是,整个约瑟夫问题求解,复杂度降低为O(klogn)递归表达式如下...,我们找到了更深层次约瑟夫问题求解策略,大大降低了问题时间复杂度。...以上就是约瑟夫问题数学部分全部内容,从下一篇起,我们进入魔术部分,看看这一神奇结构能够怎样配合上我们魔术表演,去继续缔造属于我们奇迹。

40010
  • Josephu(约瑟夫约瑟夫环) 问题

    单向环形链表应用场景 Josephu(约瑟夫约瑟夫环) 问题 Josephu 问题为:设编号为 1,2,… n n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m...那个人出列,它下一位又从 1 开始报数,数到 m 那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号序列。...提示:用一个不带头结点循环链表来处理 Josephu 问题:先构成一个有 n 个结点单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点下一个结点又从...更通俗说,他就是一个圆形蛋糕,分成四份的话,我们有两个指针,一个指向第一块,一个指向最后一块,然后他们一起移动,后指针永远在前指针后面做好对接准备。 约瑟夫问题-创建环形链表思路图解 ?...约瑟夫问题-小孩出圈思路分析图 ? 我自己画了一个图 ?

    83940

    约瑟夫问题与魔术(一)——数学模型求解

    约瑟夫问题,相信对有一点数学或者信息学竞赛背景同学应该都不会很陌生,这是数学竞赛中常见一个考题背景以及数据结构中用循环链表建模一个代表性应用。...问题定义和历史沿革 约瑟夫问题(有时也称为约瑟夫斯置换,但严格来讲这并不是一个集合到自身映射,所以不是置换,需要推广到集合序列到集合序列映射才行。),是一个出现在计算机科学和数学问题。...问题:给定人数、起点、方向和要跳过数字,选择初始圆圈中位置以避免被处决。 大家一定很好奇这个问题名字由来。这个问题是以弗拉维奥·约瑟夫命名,他是1世纪一名犹太历史学家。...约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他存活归因于运气或天意,他不知道是哪一个。 哈哈,这么个数学味浓厚问题居然是个历史学家发明了,真是有趣。...具体到这个问题,因为我们不太需要对环上元素进行像数组那样随机下标访问,而比较看重“下一个”这个环上核心关系,中间还涉及很多删除元素,也就是修改这个映射操作。

    82240

    约瑟夫问题

    一、约瑟夫问题介绍 1、约瑟夫问题原题: n个小孩子手拉手围成一个圈,编号为k(1 <= k <= n )的人从1开始报数,报到m那个人出列,它下一位又从1开始报数,报到m又出列……依此类推,直到所有人都出列...2、问题分析: 根据题目的描述,很容易可以想到用单向循环链表来模拟。...遍历时候,当节点next等于first时,表示遍历完毕。...2、代码实现: 根据上面的分析,可以写出如下代码: package com.zhu.study.linkedList; /** * 约瑟夫问题,即单向循环链表问题 * @author: zhu...cur和pre同时移动(m-1)次,此时cur就指向了要被删除节点;打印要被删除节点,然后将cur移动到被删除节点下一个节点,即cur = cur.next,prenext指向新cur,即pre.next

    47220

    约瑟夫问题

    一、问题描述 约瑟夫问题是一个很经典问题:一个圈共有N个人(N为不确定数字),按顺序第一个人编号为1,第二个人编号为2,第三个人编号就为3,以此类推第N个人编号就为N,现在提供一个数字K,...举一个简单例子:假设一个圆桌上有8个人,即N值为8,他们在进行一个小游戏,从第一个人开始报数,报到3(即K值为3),需要喝酒,喝醉为止,喝醉后出局不能再喝,求出他们喝醉人顺序。...答案是:3 6 1 5 2 8 4 7 分析:如上图所示,圈内数字代表每个人编号,从1开始编号到8。圈中数字代表出局的人数,黑色是已经喝醉出局的人。...1:代码 #include //约瑟夫环 int main() { int ren=0;//人数 int k=0;//报数 int sum=8; int arr[100]...1:可以直接输入想报到几出局,以及想要得总人数 #include //约瑟夫环 int main() { int ren=0;//人数 int k=0;//报数 printf

    10810

    约瑟夫问题

    以前写程序,今天在整理文件时候发现了,贴出来有需要朋友可以参考! 问题提出: 约瑟夫环是一个数学应用问题:已知n个人(以编号0,2,3...n-1分别表示)围坐在一张圆桌周围。...从编号为k的人开始报数,数到m那个人出列;他下一个人又从1开始报数,数到m那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 解决方案: 约瑟夫环有递归和非递归两种解决方案。 1....下面给出用数组解决源码: namespace JosephusRing { class Josephus { public int[] Jose(int total...int[] result = new int[total];//定义存储出列顺序数组 int count = 0;//定义出列计数器 //people...先来看一下递归函数: 为了简化问题,我们假设k=0,设f(n,m,i)为n个人环,报数为m,第i个人出环编号 当i=1时,f(n,m,i) = (m-1)%m 当i!

    64120

    具体数学》学习笔记

    第1章 递归问题 1.1河内塔 $n$个盘子汉诺塔问题需要移动$2^n - 1$次 1.2平面上直线 $n$条直线最多能将平面划分为$\frac{n(n+1)}{2}$个区域 1.3约瑟夫问题 约瑟夫问题...$\sum$后面的量成为被加数(summand) $\sum_{k=1}^{\pi(N)}\frac{1}{p_k}$ 其中$p_k$表示第$k$个素数,$\pi(N)$是$\leqslant N$素数个数...这个和式给出了接近$N$随机整数平均而言有多少个素因子,因为那些整数中大约有$1/p$个能被$p$整除,对于大$N$,它值近似等于$lnlnN + M$,其中 $$M \approx 0.261...,$H_n$称为一个“调和数”(harmonic number) 2.3 和式处理 设$K$是任意一个有限整数集合,$K$中元素和式可以用三条简单法则加以变换: $$\sum_{k \in K}ca_k..._{k = 1}^m p_k$$ 4.3 素数例子 素数有无穷多个 形如$2^p - 1$数,称为梅森素数(Mersenne number) 4.4 阶乘因子 斯特林公式 $$n!

    72250

    具体数学-第1课(递归求解实际问题

    原文链接: 具体数学-第1课 - WeiYang Bloggodweiyang.com ?...这学期提前选修了研究生课程:具体数学、人工智能前沿、NLP讨论班,就随便记记具体数学每一节课所学东西吧。 第一节课讲都是一些很简单东西,这里就一带而过了。...汉诺塔问题 这是个老生常谈问题了,n个盘子,3个柱子汉诺塔问题,最少移动次数记为 ? 。 那么 ? 边界条件为 ? 。 解出 ? 验证可以采用数学归纳法,这里就不多说了。...约瑟夫问题 这个问题暴力求解的话模拟就行了,复杂度是 ? ,这里探索一种直接求解方法。 分两种情况讨论: 当有 ? 个人时,踢掉 ? 个人之后,情况如下图所示 ?...最大2幂,那么 ? 正确性可以通过数学归纳法求证。 第一节课就讲了这么多,约瑟夫环还有很多问题值得探讨,下节课继续。。。

    46330

    约瑟夫问题与魔术(五)——魔术《自我匹配奇迹》中数学原理

    前面说了,约瑟夫过程在扑克牌叠上只是一个复杂但又确定操作过程,应用时候一方面要防止枯燥无聊,另一方面最好再结合一切其他魔术或数学方法一起使用,才能锦上添花,画龙点睛,发挥这个原理最大作用。...比如,我虽然知道取余数,取模这等操作,但并没有把它当作其实和正常四则运算同等地位运算来理解,而是以别扭方式来在错误基础上打补丁,特例能解决但是并没有解决根本问题,可见研究问题视角选择有多么重要...那来看看看这里没有变具体是什么吧?拿走3张以后第一张其实是第4张,不变,最后一张其实是第8张不变。观众朋友们,第8和4张之间差距4是什么呀,正好就是周期大小啊!...末两位恰好是0~3之间数二位二进制表示,值为(n - 4)。根据前面k = 2约瑟夫问题公式,其最后一张牌索引即为2(n - 4),即三位二进制数右移一位结果。...从这里也可以看出k = 2约瑟夫问题结论另一种表述和物理意义,其实是这个纯位指数值模相反数模张数n结果。

    80510

    约瑟夫问题详解

    在牛客网上做到一道题,是约瑟夫变型,所以借此学习一下新知识,并且巩固一下对题目意思理解,这一篇仅作约瑟夫问题解释,下一篇再写题目: ##1.首先,我们先来了解一下什么是约瑟夫问题: 讲一个比较有意思故事...见图下: 这时候,我们从3号开始,就成了另外一个规模小1约瑟夫问题(恰好为2^k特例)。...这时候,我们可以把3号看成新约瑟夫问题1号位置: J(8) = J(2^3) = 1,也就是说这里1代表就是上一个问题3号 So:J(9) = 3 答案为3号 ####同理可知所有的非...假设n = 11,这时候n = 2^3 + 3,也就是说t = 3,所以开始剔除元素直到其成为2^k问题约瑟夫问题。...q个人 约定: Jq(n)表示n人构成约瑟夫环,每次移除第q个人解 n个人编号从0开始至n-1 我们沿用之前特例思想:能不能由Jq(n+1)问题缩小成为J(n)问题(这里n是n+1规模约瑟夫问题消除一个元素之后答案

    41410

    经典算法之约瑟夫问题

    问题是,给定了和,一开始要站在什么地方才能避免被处决? Josephus要他朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 数学解法 ?...当n,m数据量很小时候,我们可以用循环链表模拟约瑟夫过程。当模拟到人数等于1时候,输出剩下的人序号即可。 具体解法这种方法往往实现起来比较简单,而且也很容易理解。...+n-2)%n1(n1为当前序列总人数,因为是循环序列,k1+n-1可能大于总人数) 那么这时我们要解决问题就是n-1个人报数问题(即n-1阶约瑟夫问题) 可能以上过程你还是觉得不太清晰,那么我们重复以上过程...后面的过程与前两次过程一模一样,那么递归处理下去,直到最后只剩下一个人时候,便可以直接得出结果 当我们得到一个人时候(即一阶约瑟夫问题结果,那么我们是否能通过一阶约瑟夫问题结果,推导出二阶约瑟夫结果呢...借助上面的分析过程,我们知道,当在解决n阶约瑟夫问题时,序号为k1的人出列后,剩下n-1个人又重新组成了一个n-1阶约瑟夫环,那么 假如得到了这个n-1阶约瑟夫问题结果为ans(即最后一个出列的人编号为

    1.6K10
    领券