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;
}

猜你喜欢

转载自blog.csdn.net/qq_34427165/article/details/81255663