数学故事—约瑟夫问题与因式分解

合集下载

3约瑟夫斯问题

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张)

浙教版数学八下课件2.2一元二次方程的解法(一)(20张)
例2 、解下列一元二次方程
(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)

抽杀问题-约瑟夫问题课件(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问题数学解法

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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圈之后,把约瑟夫斯剩下来的。

相关文档
最新文档