ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【C语言】新手必学:约瑟夫环 【数组+循环】

2020-12-04 23:59:16  阅读:196  来源: 互联网

标签:count int 必学 C语言 num 编号 新手 自杀 报数


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有