#include<stdio.h>
int main()
{
int All[50] = { 0 };//存活的人下标对应的值为零
int all, alive, deathnum, counter, order;//原有总人数,存活人数,计数器(报数),死亡序号
int i;
scanf("%d %d", &all, &deathnum);
printf("总共有%d人\n每报数到%d的人自杀\n", all, deathnum);
alive = all;
//按照人物编号进行遍历(i+1即为人物编号)
for (i = 0, counter = 1, order = 0; alive >= deathnum; counter++, i++)
{
i %= all;//保证i的范围在 0 到 总人数-1 之间
while (All[i] != 0)//如果i号已经自杀,则跳过i号判断i+1号
{
i++;
i %= all;
}
if (counter % deathnum == 0)//如果报数到3
{
order += 1;//死亡人数(序号)+1
All[i] = order;//自杀的人下标对应的值为死亡序号
alive--;//存货人数-1
//按死亡顺序输出自杀者
printf("第%d个自杀的是%d号\n", order, i + 1);
}
}
printf("\n");
//按编号顺序输出自杀者
for (i = 0; i < all; i++)
{
if(All[i]!=0)
printf("%d号是第%d个自杀的\n", i + 1, All[i]);
}
printf("\n");
//输出存活者
for (i = 0; i < all; i++)
{
if (All[i] == 0)
printf("%d号存活下来了\n", i + 1);
}
return 0;
}
约瑟夫问题C语言
最新推荐文章于 2024-07-24 17:46:08 发布