C语言小练习——约瑟夫环问题

问题描述:使用数组法解决约瑟夫环问题
约瑟夫入狱,监狱内共有33个犯人。某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数。依次类推,直至剩下最后1名犯人可被赦免。聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,他站在这个位置,最终避免了自己被枪毙,逃出升天。
问:约瑟夫算出的是哪个位置?
解决方案提示:对于约瑟夫环问题来说,需要解决4个问题
⒈需要一个长度为33的数组,数组内需要存储什么?
⒉如何解决数组循环的问题?
⒊如何解决“逢7一杀”这个逻辑?
⒋如何处理“已死之人”?

代码:#include<stdio.h>
int main()
{
    int fanren[33]={0};//用0/1表示犯人是否存活,0表示存活,1表示死亡
    int i,j,k=-1;
    for(i=0;i<32;i++)//外层循环表示要枪毙32个犯人
    {
        for(j=0;j<7;j++)//内层循环表示每隔7个犯人
        {
            k++;//表示当前犯人下标
            if(k==33)//越界处理
                k=0;
            if(fanren[k]==1)//如果该犯人已死,则应在报数中-1
                j--;
        }
        fanren[k]=1;//找到第7个犯人
        printf("第%d号已被枪毙\n",k+1);
    }
    for(i=0;i<33;i++)
    {
        if(fanren[i]==0)//跳过所有已被枪毙的犯人
            printf("第%d号存活\n",i+1);
    }
    return 0;
}

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值