当前位置: 首页 > 所有学科 > 数学

约瑟夫环数学公式,约瑟夫环 公式

  • 数学
  • 2023-06-30

约瑟夫环数学公式?则获胜者在上一局的编号是[(m-1)+(k+1)]=m+k(m-1代表死的那个人的编号,而k+1代表死的那个人的后面第n个人的编号),即在上一局中他是第m+k+1个人。那么,约瑟夫环数学公式?一起来了解一下吧。

约瑟夫定理公式

23-7圈一圈是指将一个圆基稿分成23份,然后在其中7个相邻的部分上打上标记,那么如何圈出这7个标记所在的区域呢?

首先,我们可以将圆看作一个钟表,将23个区域从12点开始顺时针依次编号为1到23。然后,从任意一个标记开始,顺时针数7个区域,将这个区域圈起来。接着,从刚才圈起来的纳敏区域开始,再次顺洞锋枝时针数7个区域,再将这个区域圈起来。如此往复,直到将所有的标记所在的区域圈起来为止。

实际操作时,我们可以使用一支笔或者手指,从标记开始顺时针移动数个区域,然后用另一种颜色的笔或者手指将这个区域圈起来。然后再从圈起来的区域开始继续移动数个区域,重复上述操作,直到所有的标记所在的区域都被圈出来。

需要注意的是,每次圈起来的区域要紧贴着上一次圈起来的区域,不能有遗漏和重复的部分。此外,如果最后发现有标记所在的区域没有被圈起来,需要重新检查圈的步骤是否正确。

总之,23-7圈一圈的方法虽然看起来有些复杂,但只要按照顺时针数7个区域的方法进行圈选,就可以准确地圈出所有的标记所在的区域。

概率论约瑟夫环问题

答案:23-7圈一圈的方法是先圈第23个销哗人,然后再每隔7个人圈一个人,直到所有人都被圈过为止。

解释:这个问题其实就是一个约瑟夫环问题,即在一群人中按照睁迟一定规律依次淘汰人,最后留下的人是谁。在这个问题中,我们需要先确定起始点,也就是第一个被圈的人是谁,然后每次按照规律圈定下一个被淘汰的人,直到所有人都被淘汰完毕。

拓展:约瑟夫环是一个经典的数悉斗李学问题,它的应用涉及到很多领域,比如密码学、计算机算法等。除了23-7圈一圈这种特殊情况,还有很多不同的规律和初始条件,都可以形成不同的约瑟夫环问题。对于这些问题,我们可以通过数学方法来求解,得到最终留下的人是谁。

约瑟夫环数原理

约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特兄哗启城达芦衫47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了羡如他原先的牺牲品一起投降了罗马。

约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。

约瑟夫环数学解法

约瑟夫算法:n个人围成一圈,每人有一个各不相同中败的编号,选择一

个人作为起点,然后顺时针从1到k数数,每数到k的人退出圈子,圈

子缩小,然后从下一个人继续从1到k数数,重复上面过程。求最后推

出圈子的那个人原来的编号。

约瑟夫算法可以用循环链表和数组来解(这两个我会),下面2个程序

都是用来解决该算法的,其中第(2)直接给出答案,每个程序都有

证明和讲解,

程序1(递归法):

#include

#include

int main(void)

{

int n;

int m;

int i = 0;

int p;

scanf("%d%d", &n, &m);

while (++i <= n )

{

p = i * m;

while (p>n)

{

p = p - n + (p-n-1) / (m-1);

}

printf("%d\n", p);

}

return 0;

}

程序2(递推法):

#include

int main(void)

{

int i;

int s = 0;

int n;

int m;

scanf("%d%d", &n, &m);

for (i = 2; i <= n; i++)

{

s = (s + m) % i;

}

printf("最后的获胜者是: %d\n", s + 1);

return 0;

}

程序1证明:

假设数到第p个数时遇到的数,和数到第x个数到遇到的数一样,且p -

n < x < p,而且x % m != 0, 否则会被跳过和晌拿第个p数遇到的数肯定

不一样,那么说明数了x个数之后再数一圈就数到了第p个数,而数一圈

数过的数应该是n减去要跳过的数卖谨颤,因为已经数过了x个数,所以要跳过

[x / m]个数( []表示取整数部分 ),所以x + n - [x / m] = p

问题转化为: p - n = x - [x / m]...(1),且 x % m != 0, p - n <

x < p, 求解x

因为x % m != 0 => x / m - 1 < [x / m] < x / m

=> x - x / m + 1 > x - [x / m] > x - x / m

=> [x - x / m + 1] >= x - [x / m] > [x - x / m]

=> [x - x / m] + 1 >= x - [x / m] > [x - x / m]

=> [x - x / m] + 1 >= x - [x / m] >= [x - x /

m] + 1

=> [x - x / m] + 1 = x - [x / m]

( 代入(1)式 )=> p - n - 1 = [x - x / m] = [x * ( m - 1 ) /

m] ... (2)

因为x % m !=0 且 ( m - 1 ) % m != 0 => ( x * ( m - 1 ) ) %

m != 0

由(2)式 => 0 < x * ( m - 1 ) - m * ( p - n - 1 ) <= m - 1

由左边: => m * ( p - n - 1 ) < x * ( m - 1 )

=> m * ( p - n - 1 ) / ( m - 1 ) < x

=> [m * ( p - n - 1 ) / ( m - 1 )] < x

=> [m * ( p - n - 1 ) / ( m - 1 )] + 1 <= x ...(3)

由右边: => x * ( m - 1 ) - ( m - 1 ) <= m * ( p - n - 1 )

=> ( x - 1 ) * ( m - 1 ) <= m * ( p - n - 1 )

=> x - 1 <= m * ( p - n - 1 ) / ( m - 1 )

=> x - 1 <= [m * ( p - n - 1 ) / ( m - 1 )]

=> x <= m * ( p - n - 1 ) / ( m - 1 ) + 1 ...(4)

由(3),(4) => x = [m * ( p - n - 1 ) / ( m - 1 )] + 1

= [ p - n - 1 + ( p - n - 1 ) / ( m - 1 )] +

1

= p - n - 1 + [( p - n - 1 ) / ( m - 1 )] + 1

= p - n + [( p - n - 1 ) / ( m - 1 )]

由于计算机算整数除法直接就取整了,所以递归时就写成

p = p - n + ( p - n - 1 ) / ( m - 1 )

程序2证明:

Josephus(约瑟夫)问题的数学方法(转)约瑟夫 (转)

无论是用链表实现还是用数组实现都有一个共同点:要模拟整个

游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n

,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间

内出结果的。

约瑟夫环递归公式

23-7圈一圈是指在一个圆形区域内,从起点开始,连陪旅好续圈数为23圈,每圈连续7个数字,最后停在第23圈的第7个数字上。圈数和数字的顺序均为顺时针方向。

这个问题可以用数学方法来解决。我们可以将圆形区域看作一个由360个数字组成的环形,然后按照顺时针方向从1开始逐个标记每个数字,直到360。接下来,我们可以用以下公式来计算最后停留的数字:

起始数字 + (圈数-1) * 每圈数字数 + 停留数字位置

其中,起始数字为1,圈数为23,每圈数字数为7,停留数字位置为第7个。将这些值代入公式中,即可得到最后停留的数字为179。

实际解答方式为:可以用笔和纸模拟出这个过程,即按照顺时针方向一个一个地标记数字,直到停留在第23圈的第7个数字上。这种方法比较直观,但比较耗时。

对策为:使用数学方法计算,可以大大缩短时间,提高计算准确性。如果需要解决类似的问题,也可以采用类似的数学方法来解决。

拓展说明:这个问题实镇盯际上是一个经典的数学问题,被称为“圆周率的近似值问题芦铅”。这个问题在历史上曾经引起过很多数学家的关注和研究,也是计算机科学的基础之一。除了数学方法,还有一些其他的算法可以用来解决这个问题,比如递归算法、分治算法等。

以上就是约瑟夫环数学公式的全部内容,我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):k k+1 k+2 n-2, n-1, 0, 1, 2, k-2 并且从k开始报0。

猜你喜欢