约瑟夫环问题

使用数组法解决约瑟夫环问题
约瑟夫入狱,监狱内共有33个犯人。某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数。依次类推,直至剩下最后1名犯人可被赦免。聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,他站在这个位置,最终避免了自己被枪毙,逃出升天。
问:约瑟夫算出的是哪个位置?
提示:对于约瑟夫环问题来说,需要解决3个问题

  1. 如何解决数组循环的问题?
  2. 如何解决“逢7一杀”这个逻辑?
  3. 如何处理“已死之人”?

代码的实现:

#include <stdio.h>
#define N 33
#define KILL 7
int main(){
    /*定义犯人数组,全部元素置零表示没被噶*/
    int prisoner[N] = {0};
    /*记录被噶了几个犯人*/
    int counter = 0;
    /*数组索引*/
    int index = 0;
    /*报数*/
    int num = 0;
    /*有一个辛存者,所以被噶了32个犯人时结束循环*/
    while(counter != N-1){
        /*如果数组索引=33,则置零再继续*/
        if(index == N){ 
            index = 0;
        }
        /*值为0 ,说明还没噶,要继续报数*/
        if(prisoner[index] == 0){ 
            num++;
            /*报到7的人,噶了*/
            if(num == KILL){
                prisoner[index] = 1;
                /*被嘎人数+1*/
                counter++;
                /*有人被噶,重新从1开始报数*/
                num = 0;
                printf("第%2d轮报数,%2d号位置的人被嘎了\n",counter,index+1);
            }
        }
        index++;
    }   
    /*循环结束,遍历数组,看看约瑟夫站哪了*/
    for(int i = 0;i < N;i++){
        if(prisoner[i] == 0){ 
            printf("约瑟夫在第%d个位置\n",i+1);
        }
    }   
    return 0;
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值