什么是约瑟夫法则

来源:百度知道 编辑:UC知道 时间:2024/09/22 04:18:34

约瑟夫环(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 <stdio.h>
#include <stdlib.h>

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) / (