【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;  //退出循环
        }
    }
    }
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值