数学故事—约瑟夫问题与因式分解
3约瑟夫斯问题
• 例3:有100张的一摞卡片,玲玲拿着它们,从 最上面的一张开始按如下的顺序进行操作:把 最上面的第一张卡片舍去,把下一张卡片放在 这一摞卡片的最下面。再把原来的第三张卡片 舍去,把下一张卡片放在最下面. 反复这样做直 到手中只剩下一张卡片,那么剩下的这张卡片 是原来那一摞卡片的第几张?
• 练习1:有两副扑克牌,每副牌的排列顺 序均按头两张是大王、小王,然后黑桃、 红桃、方块、梅花4种花色排列,每种花 色的牌又按 2,3,的顺序排列。某人把 按上述排列的两副扑克牌上、下叠放在一 起,然后把第1张丢掉,把第2张放在最底 层,再把第3张丢掉,把第4张放在最底层 ,,如此进行下去,直到最后只剩下一张 牌。试问剩下的这张牌是哪一张?
• 例2:有1000个学生坐成一圈,依次编号为1,2, 3,…,1000. 现在进行1,2,1,2,…这样报数. 1号学生报1后立即离开,2号学生报2并留下; 三号学生报1后立即离开,4号学生报2并留下; …;如此进行下去,报1的同学离开,报2的同 学留下,直到最后还剩下1个人. 问这个人的编 号是多少?
百度文库
• 例4:把1,2,. . . ,999这999个数均匀排 成一个大圆圈,从1开始数:隔过1划掉2, 3,隔过4,划掉5,6,. . .,这样每隔一个 数划掉两个数,转圈划下去. 问:最后剩下 哪个数?为什么?
例5:圆周上放有N枚棋子,如
右图所示. B点的一枚棋子
抽杀问题-约瑟夫问题
[阅读材料]世界名题与小升初之:
抽杀问题(約瑟夫问题)
--马到成功老师在各类竞赛中,各类小升初考试中相关的世界名题出现的概率极高,这是由小升初与数学竞赛的特点决定,这特点便是:知识性,趣味性,思想性相结合。
先给大家介绍这一问题的由来。
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特後,39 個犹太人与Josephus及他的朋友躲到一個洞中,39個犹太人決定宁愿死也不要被人抓到,于是決定了一个自杀方式,41個人排成一个圆圈,由第1個人开始报数,每报数到第3人该人就必須自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他將朋友与自己安排在第16個与第31個位置,于是逃过了这场死亡游戏。
解法
約瑟夫问题可用代数分析來求解,将这个问题扩大好了,假设现在您与m个朋友不幸参与了这个游戏,您要如何保护您的朋友?只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆圈是排列顺序,而外圈是自杀顺序,如下图所示:
使用程式来求解的话,只要将阵列当作环状来处理就可以了,在列中由计数1开始,每找到三个无资料区就填入一个计数,直接计数來求解的話,只要將阵列当作环状来处理就可以了,在阵列中由計数1开始,每找到三个无资料区就填入一个計数,直而計数达41为止,然后將阵列由索引1开始列出,就可以得知每个位置的自杀順序,这就是約瑟夫排列,41個人报数3的約瑟夫排列如下所示:
14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23
数学故事—约瑟夫问题与因式分解
数学故事——约瑟夫问题与因式分解有一个古老的传说,有64名战士被敌人俘虏了,敌人命令它们排成一个圈,编上号码1,2,3,……64。敌人把1号杀了,又把3号杀了,他们是隔一个杀一个这样转着圈杀。最后剩下一个人,这个人就是约瑟夫,请问约瑟夫是多少号?
这就是数学上有名的“约瑟夫问题”。给大家一个提示,敌人从l号开始,隔一个杀一个,第一圈把奇数号码的战士全杀死了。剩下的32名战士需要重新编号,而敌人在第二圈杀死的是重新编排的奇数号码。按照这个思路,看看你能不能解决这个问题?
(答案)
由于第一圈剩下的全部是偶数号2,4,6,8,……64。把它们全部用2除,得1,2,3,4,……32.这是第二圈重新编的号码。第二圈杀过之后,又把奇数号码都杀掉了,还剩下16个人。如此下去,可以想到最后剩下的必然是64号。
64=2×2×2×2×2×2,它可以连续被2整除6次,是从1到64中质因数里2最多的数,因此,最后必然把64号剩下。从64=2×2×2×2×2×2还可以看到,是转过6圈之后,把约瑟夫斯剩下来的。
约瑟夫斯问题探究
约瑟夫斯问题探究
学而思培优陈绍伦问题背景
据说著名犹太历史学家约瑟夫斯有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与约瑟夫斯及他的朋友躲到一个洞中,他们宁死也不愿被敌人抓到,于是决定了一个自杀方式:41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.
可是约瑟夫斯和他的朋友并不想遵从,他们打算选择合适的位置,留到最后避免处决.于是,他将朋友与自己安排在第16个与第31个位置,逃过了这场死亡游戏.也因此,我们以故事的主人公命名这一系列的“抽杀”问题.
情景一:直线型
让我们先从比较简单的直线型猫吃老鼠着手研究.
【问题1】(隔1吃1)
猫将4只老鼠排成一行,先隔1只,再吃1只,再隔1只,再吃1只,……一轮结束后再次重新开始,直到最后剩下1只老鼠,这只老鼠是原来的第________只.
其实这题更像是一个“脑筋急转弯”:第一只老鼠有可能被吃掉吗?答案显而易见!
结论:排成一行,隔1吃1,留下的总是第1只.
【问题2】(吃1隔1)
(1)猫将4只老鼠排成一行,先吃1只,再隔1只,再吃1只,再隔1只,……一轮结束后再次重新开始,直到最后剩下1只老鼠,这只老鼠是原来的第________只.
(2)猫将10只老鼠排成一行,先吃1只,再隔1只,再吃1只,再隔1只,……一轮结束后再次重新开始,直到最后剩下1只老鼠,这只老鼠是原来的第________只.
对于数字比较简单的情况,实际动手操作是得到答案的好方法!
(1)4只老鼠时:
第一轮猫吃掉1、跳过2、吃掉3、跳过4,留下2、4;
浙教版数学八下课件2.2一元二次方程的解法(一)(20张)
(1)(x 5)(3x 2) 10 (2) (3x 4)2 (4x 3)2
பைடு நூலகம்
例2 、解下列一元二次方程
(1)(x 5)(3x 2) 10 (2)(3x 4)2 (4x 3)2
解:(1)化简方程,得
3x2 17x 0
方程左边因式分解,得
边为零;
*将方程的左边分解因式; *根据若A·B=0,则A=0或B=0,将解一元二次方程
转化为解两个一元一次方程。
化归思想
辩一辩:下列解一元二次方程的方法对吗? 若不对,请改正
y² =3y
改正:y²=3y
解:两边同时除以y得: y=3
x
解:移项得:
y² -3y=0 y(y-3)=0 y=0或y-3=0 解得 :y1=0,y2=3
2x+3=0,或2x-3=0.
解得x1=- ,x2=
结论: 若A×B=0,则 A=0或B=0。
请利用上面的结论解方程:
例1:解下列方程:
1 x2 3x 0
2 25x2 16
像上面这种利用因式分解解一元二 次方程的方法叫做因式分解法。
它的基本步骤是:
*若方程的右边不是零,则先移项,使方程的右
x(3x 17) 0
x 0 ,或3x 17 0
解得
x1
抽杀问题-约瑟夫问题课件(16张PPT)
故事引入
提出问题
推导公式
变式拓展
50 1
49
第一步:去掉1、3、5···33、35
一共18位同学,剩余50-18=32=25位
同学;
……
第二步:把37号同学看作为第一位 同学,重新开始报数;
第三步:按照2n位同学做游戏的规 律,可以得到最后留下的编号的 2 38
是36。
37 1
36 2
35
34
23 4 5
……
故事引入
提出问题
推导公式
变式拓展
第一步:去掉1、3、5···2(x2n)-1,一共x-2n位同学,剩余2n位 …… 同学;
第二步:把2(x-2n)+1号同学看 作为第一位同学,重新开始报数;
第三步:按照2n位同学做游戏的 规律,可以得到最后留下的编号 2(x-2n)+1 的是2(x-2n)。
X1
故事引入
提出问题
推导公式
变式拓展
2n位同学留1去2的话,会剩下哪位同学? 编号最小的那位同学
故事引入
提出问题
推导公式
变式拓展
第一步:去掉2、4、5···36一共 18位同学,剩余50-18=32=25位同学;
50 1
49
第二步:把37号同学看作为第一位 …… 同学,重新开始报数;
第三步:按照2n位同学做游戏的规
小学趣味数学故事之约瑟夫问题
小学趣味数学故事之约瑟夫问题
数学中的一些美丽定理具有这样的特性: 它们极易从
事实中归纳出来, 但证明却隐藏的极深.下面是为大家收集的趣味数学故事之约瑟夫问题,供大家参考。
有一个古老的传说,有64名战士被敌人俘虏了,敌人命令它们排成一个圈,编上号码1,2,3,……64。敌人把1号杀了,又把3号杀了,他们是隔一个杀一个这样转着圈杀。最后剩下一个人,这个人就是约瑟夫,请问约瑟夫是多少号?
这就是数学上有名的“约瑟夫问题”。给大家一个提示,敌人从l号开始,隔一个杀一个,第一圈把奇数号码的战士全杀死了。剩下的32名战士需要重新编号,而敌人在第二圈杀死的是重新编排的奇数号码。按照这个思路,看看你能不能解决这个问题?
答案解析:
由于第一圈剩下的全部是偶数号2,4,6,8,……64。把它们全部用2除,得1,2,3,4,……32.这是第二圈重新编的号码。第二圈杀过之后,又把奇数号码都杀掉了,还剩下16个人。如此下去,可以想到最后剩下的必然是64号。
64=2×2×2×2×2×2,它可以连续被2整除6次,是从1
到64中质因数里2最多的数,因此,最后必然把64号剩下。
从64=2×2×2×2×2×2还可以看到,是转过6圈之后,把约瑟夫斯剩下来的。
约瑟夫问题大全
“约瑟夫”问题及若干变种
林厚从
例1、约瑟夫问题(Josephus)
[问题描述]
M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,再从下一个猴子开始继续1~ N报数,如此循环,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和N由键盘输入,1≤N,M≤10000,打印出最后剩下的那只猴子的编号。
例如,输入8 3,输出:7。
[问题分析1]
这个例题是由古罗马著名史学家Josephus提出的问题演变而来的,所以通常称为Josephus(约瑟夫)问题。
在确定程序设计方法之前首先来考虑如何组织数据,由于要记录m只猴子的状态,可利用含m 个元素的数组monkey来实现。利用元素下标代表猴子的编号,元素的值表示猴子的状态,用monkey[k]=1表示第k只猴子仍在圈中,monkey[k]=0则表示第k只猴子已经出圈。
程序采用模拟选举过程的方法,设变量count表示计数器,开始报数前将count置为0,设变量current表示当前报数的猴子编号,初始时也置为0,设变量out记录出圈猴子数,初始时也置为0。每次报数都把monkey[current]的值加到count上,这样做的好处是直接避开了已出圈的猴子(因为它们对应的monkey[current]值为0),当count=n时,就对当前报数的猴子作出圈处理,即:monkey[current]:=0,count:=0,out:=out+1。然后继续往下报数,直到圈中只剩一只猴子为止(即out=m-1)。参考程序如下:
具体数学笔记-约瑟夫问题
具体数学笔记-约瑟夫问题
据说著名犹太历史学家Josephus有过以下的故事:
在罗马⼈占领乔塔帕特后,39 个犹太⼈与Josephus及他的朋友躲到⼀个洞中,39个犹太⼈决定宁愿死也不要被敌⼈抓到,于是决定了⼀个⾃杀⽅式,41个⼈排成⼀个圆圈,由第1个⼈开始报数,每报数到第3⼈该⼈就必须⾃杀,然后再由下⼀个重新报数,直到所有⼈都⾃杀⾝亡为⽌。
然⽽Josephus和他的朋友并不想遵从。⾸先从⼀个⼈开始,越过k−2个⼈(因为第⼀个⼈已经被越过),并杀掉第k个⼈。
接着,再越过k−1个⼈,并杀掉第k个⼈。这个过程沿着圆圈⼀直进⾏,直到最终只剩下⼀个⼈留下,这个⼈就可以继续活着。问题是,给定了和,⼀开始要站在什么地⽅才能避免被处决?
Josephus要他的朋友先假装遵从,他将朋友与⾃⼰安排在第16个与第31个位置,于是逃过了这场死亡游戏。
现在考虑k=2时的问题,我们设J(n)表⽰当有n个⼈时幸存者的编号。
假设⼀开始有2n个⼈,那么⼀轮后会剩下1,3,5,7...2n−1,并且⼜是从1开始跳。
所以J(2n)=2J(n)−1
奇数的情况差不多,会剩下3,5,7,9....2n+1
所以J(2n+1)=2J(n)+1
⽤这个⽅法可以在log2n的时间内求出J(n)
接下来我们可以打⼀个表
容易发现J(2m+l)=2l+10≤l<2m
⽤数学归纳法很容易证。
⾄此这个问题已经解决,但我们还可以发现⼀些东西。
设n的⼆进制展开为
n=(b m b m−1...b1b0)2b m=1
把2l+1表⽰出来
2l+1=(b m−1...b1b01)2
约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解)
题⽬:
Josephus有过的故事:39 个犹太⼈与Josephus及他的朋友躲到⼀个洞中,39个犹太⼈决定宁愿死也不要被敌⼈抓。于是决定了⾃杀⽅式,41个⼈排成⼀个圆圈,由第1个⼈开始报数,每报数到第3⼈该⼈就必须⾃杀。然后下⼀个重新报数,直到所有⼈都⾃杀⾝亡为⽌。然⽽Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与⾃⼰安排在第16个与第31个位置,于是逃过了这场死亡游戏。
对于这个题⽬⼤概两种解法:
⼀、使⽤循环链表模拟全过程
⼆、公式法
我们假设这41个⼈编号是从0开始,从1开始报数,第3个⼈⾃杀。
1、最开始我们有这么多⼈:
[ 0 1 2 3 4 5 ... 37 38 39 40 ]
2、第⼀次⾃杀,则是(3-1)%41=2 这个⼈⾃杀,则剩下:
[ 0 1 3 4 5 ... 37 38 39 40 ]
3、然后就是从编号为3%41=3的⼈开始从1报数,那么3号就相当于头,既然是头为什么不把它置为0,这样从它开始就⼜是与第1,2步⼀样的步骤了,只是⼈数少了⼀个,这样不就是递归了就可以得到递归公式。想法有了就开始做:
4、把第2步中剩下的⼈编号减去3映射为:
[ -3 -2 0 1 2 ... 34 35 36 37 ]
5、出现负数了,这样不利于我们计算,既然是环形,37后⾯报数的应该是-3,-2,那么把他们加上⼀个总数(相当于加上360度,得到的还是它)
[ 38 39 0 1 2 3 ... 34 35 36 37 ]
小学趣味数学故事之约瑟夫问题
小学趣味数学故事之约瑟夫问题
数学中的一些美丽定理具有这样的特性: 它们极易从事实中归纳出来, 但证明却隐藏的极深.下面是为大家收集的趣味数学故事之约瑟夫问题,供大家参考。
有一个古老的传说,有64名战士被敌人俘虏了,敌人命令它们排成一个圈,编上号码1 ,2 ,3 ,……64。敌人把1号杀了,又把3号杀了,他们是隔一个杀一个这样转着圈杀。最后剩下一个人,这个人就是约瑟夫,请问约瑟夫是多少号?
这就是数学上有名的“约瑟夫问题〞。给大家一个提示,敌人从l号开始,隔一个杀一个,第一圈把奇数号码的战士全杀死了。剩下的32名战士需要重新编号,而敌人在第二圈杀死的是重新编排的奇数号码。按照这个思路,看看你能不能解决这个问题?
答案解析:
由于第一圈剩下的全部是偶数号2 ,4 ,6 ,8 ,……64。把它们全部用2除,得1 ,2 ,3 ,4 ,……32.这是第二圈重新编的号码。第二圈杀过之后,又把奇数号码都杀掉了,还剩下16个人。如此下去,可以想到最后剩下的必然是64号。
64=2×2×2×2×2×2 ,它可以连续被2整除6次,是从1到64中质因数里2最多的数,因此,最后必然把64号剩下。从64=2×2×2×2×2×2还可以看到,是转过6圈之后,把约瑟夫斯剩下来的。
1 / 1
约瑟夫问题
约瑟夫问题
简介
约瑟夫问题是一个经典的数学问题,由弗拉维奥·约瑟夫斯(Josephus Flavius)所
提出。问题的背景是:在一个固定长度的圆桌周围围坐着n个人,从第一个人开
始报数,报到m的人出圈,然后从下一个人开始重新报数,直到剩下最后一个人。问题是,给定n和m,求最后剩下的人的编号。
解法
暴力破解法
最直观的解法是使用循环和数组来模拟这个过程。首先,我们用一个数组来表
示这些人的编号,例如[1, 2, 3, ..., n]。然后我们在循环中模拟报数的过程,
每次报到m的人就从数组中删除。当数组中只剩下一个元素时,就找到了最后剩
下的人。
def josephus(n, m):
people = list(range(1, n +1))
idx =0
while len(people) >1:
idx = (idx + m -1) % len(people)
people.pop(idx)
return people[0]
这种解法的时间复杂度为O(n*m),并且在n很大的情况下,性能会变得很差。
数学公式法
约瑟夫问题其实存在一个更巧妙的解法,不需要模拟整个过程,而是通过数学公式来直接计算出最后剩下的人的编号。
如果我们将问题的规模缩小为n-1,即在一个长度为n-1的圆桌上进行同样的操作,求出的结果为f(n-1, m)。然后我们将这个结果映射到原始问题的编号上,即将f(n-1, m)变为f(n, m)。
计算f(n, m)的过程如下: - 首先,我们将f(n, m)映射到f(n-1, m)上。假设f(n, m) = x,那么f(n, m)在映射到f(n-1, m)上的过程中,每次都将整个序列向后移动m 位,即f(n, m)在映射到f(n-1, m)上的过程中,原来的第x个元素变成了第x+m个元素。因此,f(n-1, m) = (x + m) % n。 - 其次,我们将f(n-1, m)映射回f(n, m)上。假设f(n-1, m) = y,那么f(n-1, m)经过映射回到f(n, m)的过程中,每次都将整个序列向前移动m位,即f(n-1, m)在映射回f(n, m)上的过程中,原来的第y个元素变成了第y-m个元素。因此,f(n, m) = (y - m + n) % n。
约瑟夫问题
约瑟夫问题
约瑟夫问题
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
举个例子:
有64名战士被敌人俘虏了。敌人命令他们拍成一圆圈,编上号码1,2,3…,64。敌人把1号杀了,又把3号杀了,他们隔着一个杀一个这样转着圈杀。最后只剩下一个人,这个人就是约瑟夫斯。请问约瑟夫斯是多少号?(这就是“约瑟夫斯”问题。)
这个问题解答起来比较简单:敌人从1号开始,隔一个杀一个,第一圈把所有的奇数号码的战士圈杀光了。剩下的32名战士需要重新编号,而敌人在第二圈杀死的是重新编号的奇数号码。
由于第一圈剩下的全部是偶数号2,4,6,…,64。把它们全部用2去除,得1,2,3,…,32。这是第二圈编的号码。第二圈杀过以后,又把奇数号码都杀掉了,还剩16个人。如此下去,可以想到最后剩下的必然是64号。
$64=2^6$,它可以连续被2整除6次,是从1到64中能被2整除次数最多的数,因此,最后必然把64 号留下。
如果有65名战士被俘,敌人还是按上述的方法残杀战士,最后还会剩下约瑟夫斯吗?
经过计算,很容易得到结论,不是。因为第一个人被杀后,也就是1号被杀后,第二个被杀的是必然3号。如果把1号排除在外,那么还剩下的仍是64人,新1号就是3号。这样原来的2号就变成了新的64 号,所以剩下的必然是2号。
约 瑟 夫 环 问 题 的 三 种 解 法
约瑟夫问题(数学解法及数组模拟)
约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 ? 以上来自百度百科约瑟夫问题是个很有名的问题:N个人围成一个圈,从第一个人开始报数,第M个人会被杀掉,最后一个人则为幸存者,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
约瑟夫问题其实并不难,但求解的方法多种多样;题目的变化形式也很多。接下来我们来对约瑟夫问题进行讨论。
1.模拟解法优点 : 思维简单。?缺点:时间复杂度高达O(m*n)
当n和m的值较大时,无法短时间内得到答案。
[教学研究]约瑟夫问题
约瑟夫问题
[编辑本段]约瑟夫问题的来历
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计
约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。这样循环计数直到有15个人被扔下海为止。
[编辑本段]约瑟夫问题的一般形式:
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例:
#include<iostream>
using namespace std;
void main()
{
int n,m,a[101],k,i,j,num; //计数器是从1开始的,所以100
josephus问题数学解法
josephus问题数学解法
Josephus 问题是一个经典的数学问题,描述如下:
有 n 个人围成一圈,从第一个人开始往后报数,报到 m 的人
出圈,后面的人继续从 1 开始报数,直到最后一个人留下来。问最后留下的人的编号是多少?
下面是 Josephus 问题的数学解法:
设最后留下的人的编号为 f(n,m),则可以得出以下递推式:
f(1,m) = 0
f(n,m) = (f(n-1,m) + m) % n
其中,% 表示取模运算。
以上递推式基于以下思路:
假设有 n 个人,编号分别为 0,1,2,...,n-1。第一轮中,第 m 个
人出圈,剩下的人编号为 0,1,...,m-2,m,...,n-1。由于是围成一圈,所以下一轮中第一个人的编号为 m%n。而在上一轮中,编号
为 m%n 的人出圈了,所以编号为 m%n+1,...,n-1,0,1,...,m%n-1
的人组成了一个新的圈。我们需要求出这个新圈中最后留下的人的编号,即 f(n-1,m)。由于新圈中每个人的编号都比原来的
编号大 m,所以我们需要将 f(n-1,m) 加上 m,以得到在原圈中他的编号。
然而,如果加上 m 后编号超过了 n-1,那么我们需要将编号重新回到 0,这就是将加和结果取模的原因。
最终,当 n=1 时,无论 m 的值为多少,都只剩下编号为 0 的人。
下面是一个 Python 实现的例子:
```
def josephus(n, m):
f = 0
for i in range(2, n+1):
f = (f + m) % i
return f
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学故事200字数学故事——约瑟夫问题与因式分解有一个古老的传说,有64名战士被敌人俘虏了,敌人命令它们排成一个圈,编上号码1,2,3,……64。敌人把1号杀了,又把3号杀了,他们是隔一个杀一个这样转着圈杀。最后剩下一个人,这个人就是约瑟夫,请问约瑟夫是多少号?
这就是数学上有名的“约瑟夫问题”。给大家一个提示,敌人从l号开始,隔一个杀一个,第一圈把奇数号码的战士全杀死了。剩下的32名战士需要重新编号,而敌人在第二圈杀死的是重新编排的奇数号码。按照这个思路,看看你能不能解决这个问题?
(答案)
由于第一圈剩下的全部是偶数号2,4,6,8,……64。把它们全部用2除,得1,2,3,4,……32.这是第二圈重新编的号码。第二圈杀过之后,又把奇数号码都杀掉了,还剩下16个人。如此下去,可以想到最后剩下的必然是64号。
64=2×2×2×2×2×2,它可以连续被2整除6次,是从1到64中质因数里2最多的数,因此,最后必然把64号剩下。从64=2×2×2×2×2×2还可以看到,是转过6圈之后,把约瑟夫斯剩下来的。