其他分享
首页 > 其他分享> > 【C语言】新手必学:约瑟夫环 【数组+循环】

【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