约瑟夫环

复习一下关于约瑟夫环的实现原理:

如果用C来写的话,也会有许多的方法,比如1:采用链表(双向链表)2:递归3:队列(不断出队与入队) 4:非递归循环。

现在简单介绍一下非递归的约瑟夫算法。

首先,需要明白约瑟夫环的具体规则:个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。

假设从零开始报,报到m-1的人退出,那么应该报m的人开始报零,再报到m-1,该报m的人报零,以此类推,当所剩人数为二的时候,两个人依次从0报到m-1,剩下的一个人即是最后的幸存者。而在这两个人中:

假设m=4,绿色的代表剩存的人,那么在该轮报数中,其所报的数则为4%2=0;而假设m=5则有

5%2=1,在该轮中这位幸存者所报的最小数字为1。

之所以按照此方法进行探究的原因为如果n=2,即一共有两个人,以m报数,那么幸存者在游戏开始的编号为m%2。

依次类推,当n≠2,或者是n为更大的数时,这个幸存的人最开始的编号是多少m=5n=3继续作图

可知在共有三个人时最终幸存者的位置,本轮的开始到达结束共5人,结束后的第二个才是幸存者,故幸存者到达该轮的编号0间隔5+1个长度。(5+1)%3=0,可知在该轮(n=3)中,幸存者是编号0的数。

当n=2时,由于下一轮筛选只有一个数编号零,所以可以视为0,故(4+0)%2=0,(5+0)%3=1,符合假设式子。

另,当m<n时,对式子进行检验,m=3,n=5时,有

(3+0)%4=3    (3+1)%4=0   在有四个人时,绿色的应为编号3,红色的应为编号0,符合事实,在有五个人时,(3+3)%5=1,(3+0)%5=3;绿色的为1,红色的应为3,符合事实,故解法需要从最后一个开始倒推直到人数为n时,所求即为正解。

实现方法可以有:

s=0;a[0]=0;a[1]=0;

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

{s=(s+m)%i;a[i]=s;}

得到在一定的m下,不同总人数的一系列胜利者的原始编号。

下面来介绍题目的求解。

由于题目的要求是前k位留下,后k位淘汰,所以求最终剩余的方法并不方便,从后到前的时间复杂度也会变大。故使用的方法为逐个淘汰,判断 淘汰的人是否符合要求,不符合,则改变m。

要达到淘汰的为总人数的后半段,所以第一次考虑m应最小为k+1;

在此基础上,for语句循环自增m,判断合理性。

合理性的判断:

x为淘汰的人的原始编号,x=(m+s)%n      (s初始化为0,表示淘汰的人后面一个人被初始化为零后,该人的前面有几个编号的人,m+s表示的是下一次需要淘汰的人,由于共有n个人,故需要取模,使淘汰掉的人编号永远大于k,具体k个坏人的排序不需要考虑,因为是否淘汰的是坏人只需要判断是否 <k)

如果x<k 代表淘汰掉了好人,循环退出,m++;

如果x=0;说明淘汰掉的为最后一个人,设其编号为n,目的是为了避免将x<k的判断代入,影响结果。

如果处理后的淘汰人编号符合条件,则总数n--;

将淘汰的人的编码记下,其前面有多少人也记下。

当n--后与k相等,则说明该m符合条件,循环结束。

#include<stdio.h>

void main()

{

int a[15];

int x, s, i, k, n, m, tem = 0;

for (i = 1;i < 15;i++)

{

tem = 0;

for (m = i + 1;;m++)

{

if (tem == 1)

break;

s = 0;n = 2 * i;

while (1)

{

x = (s + m) % n;

if (x < 1)

x = n;

if (x <= i)

break;

n--;

s = x - 1;

if (n == i)

{

a[i] = m;

tem = 1;

break;

}}}}

while (scanf("%d", &k)&&(k != 0))

printf("%d\n",a[k]);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容