/*约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。

#include <stdio.h>
#define SIZE  100                          //代表人数 可以 改变
#define OUT  3                             //代表要数到几出局的人
int main() {
    int arr[SIZE] = { 0 };                //数据元素不等与0 的出局
    int flage = 1;                        //m 被杀掉 标志位报数
    int i = SIZE;                         //出局的人
    int k = 0;                            //下标
    int end;                              //最后的一个人
    while ( i != 0 )                      //出局的人  要出局够100个 得到最后一个
    {
        if (arr[k] == 0) {                //求每个下标是否是0 如果不是0 就寻找下一个人(22行 k++)
            if (flage == OUT) {           //标志位到3 的 k 出局
                arr[k] = 1;               //将出局的人变成1  
                i--;                      //出局一个
                flage  = 0 ;              //出局一个将标志位变0    
                end = k + 1 ;             //最后的一个人    数组下标是从0开始的所以 + 1 ;
                printf("%d\t", k +1);        
            }
            flage++;                      //如果等于0(没出局的人) ,报数不是3 将 报数 + 1 ;
        }
        k++;                              //找下一个没出局的人
        if (k >= SIZE) {                  // 如果k找到了最后一个 ,将K=0
            k = 0;                        //从头开始寻找
        }
    }
    printf("\n");
    printf("最后剩下的一个人是=====%d\n", end);
    return 0; 
}

数组实现,基础还是太差,写了一个小时!!!!!!欢迎大佬批评

😁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值