【C语言】新手必学:约瑟夫环 【数组+循环】
作者:互联网
Description:
在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。(死亡的人会从环中消失,例如3号自杀,那么当报数再次报到2号时,会直接跳过3号,4号继续报数)
现在,我们把这个问题变化一下,假设现在有n个人(最多不超过1000人),编号为1到n,他们排成一圈从1号人开始报数, 报数时报到m的人自杀(M不会超过10)问最后一个自杀的人是谁?
Input
一行,两个整数,n和m,分别为人数和编号
Output
一行,一个数,最后死的人的编号
Sample Input
5 3
Sample Output
4
Hint
假设有5个人报到3的人自杀,那么他们的自杀顺序为 3 1 5 2 4 所以输出的是4
思路:循环+数组模拟此过程,死亡的人标记一下,之后再访问时都跳过
题解:
分析:难点在于报数一轮之后怎样回到开头?这里使用了while循环来实现。
#include <stdio.h>
#include<string.h>
int main() {
int n,m;
int count=0;//记录死亡人数
int num=0;//记录轮到第几个人(所报的数)
scanf("%d %d",&n,&m);
int a[1002];
for(int i=1;i<=n;i++)
{
a[i]=1;//将所有人标记为1,代表存活
}
while(count<n)//死亡人数小于总人数时,执行循环
{
for(int i=1;i<=n;i++)
{//利用数组下标存放每个人的编号
if(a[i]==1)//如果存活,则报数加一
num++;
if(num==m){//当所报的数达到m时
a[i]=0;//标记此人为0,代表死亡
count++;//死亡人数加一
num=0;//别忘了报数清零
}
if(count==n)//当到了最后一人时
{
printf("%d",i);//输出此人编号
break; //退出循环
}
}
}
}
标签:count,int,必学,C语言,num,编号,新手,自杀,报数 来源: https://blog.csdn.net/m0_52387305/article/details/110674975