c语言经典约瑟夫环的问题,约瑟夫环问题分析-C语言经典面试题

本文探讨了经典的约瑟夫环问题,详细分析了问题描述与解决方案。通过循环报数,每数到n的人出列,直至剩下最后一个人,文章提供了C语言的编程实现,包括关键公式和代码示例,适用于C语言面试和算法练习。
摘要由CSDN通过智能技术生成

好久没有看有关算法的问题了,今天废了不少劲,再感叹一句:要想学好算法就要常练习,没什么捷径可走。废话不多说,如下:

问题描述:有m个人,围成一个环,编号为 0、1、2、3、、、m-1,从第一个人开始循环报数,假设数到n的那个人出列,然后从下一个人继续数数,数到n出列,以此循环,最后那个人为胜利者,求胜利者的编号。

分析如下:

设m为人的个数 n为要数的数 k为从第几个人开始数

第一次的数列,记为A

0 1 2 3 4 5 6 7 8 9 、、、n%m k、、、m-2 m-1

假设第一次出列了一个人,则编号肯定为n%m-1(减1因为从零开始)。k=n%m,第一次出列后的数列为

0 1 2 3 4 5 6 7 8 9 、、、k、、、m-2 m-1

第二次从k开始数数那么可以组成新的数列,记为数列B

k->0

k+1->1

k+2->2

k+3->3

k-3->m-3

k-2->m-2

如果我们知道了数列B的最终胜利者是的编号是x,那么x在原来数列A中的编号是多少呢?很容易算出来:(x+k)%m,而k=n%m,替换后为(x+n%m)%m=(x+n)%m,(x+n)%m为数列A的胜利者。那么x又该如何求呢,我们可以求数列C,就这样这么以次类推。直到只有一个人时,胜利者的编号肯定为0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值