基础C语言解决约瑟夫问题

(看约瑟夫问题百度里没有用传统C语言解决的,那就自己写了一个)

约瑟夫问题是个有名的问题:num个人围成一圈,从第一个开始报数,第call个将被杀掉,最后剩下一个,其余人都将被杀掉。例如num =6,call =5,被杀掉的顺序是:5,4,6,2,3。

分析:

(1)由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true表示死,false表示活。

(2)开始时每个人都是活的,所以数组初值全部赋为ture。

(3)模拟杀人过程,直到所有人都被杀死为止。

以上摘自百度百科,为了对应程序有所改变。

  从上述分析中我们可以得知我们需要一个bool型数组来记录每个人的死活,这里我用的people作为数组名。定义bool型数组时C语言默认它们都是ture,所以就不需要改变了。

  为了让他们知道自己是第几个被淘汰的,所以我们也列出一个淘汰名单,这里我记为died[num]。

  接下来我们就需要模拟淘汰过程了,一共需要淘汰多少次呢?

  经过脚趾头的思考,我们知道最少一共要运行num*call 次,才能全部淘汰。所以我们可以通过这种形式实现:

for(cishu=0;cishu<num*call;cishu++)
{
    //(省略淘汰过程)
    if(!people[i])cishu--;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值