(看约瑟夫问题百度里没有用传统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--;
}