weixin_42105291 2019-12-10 10:55 采纳率: 100%
浏览 284
已采纳

C语言约瑟夫循环,不使用链表,依靠指针和循环实现?

求问如何在这个代码的基础上进行修改(不删除主体),实现约瑟夫环呢?

要求淘汰的序号大于总人数时也能实现
谢谢了

#include <stdio.h>
#define MAX_M 100
#define MAX_N 100

int monkey_king(int, int);
int* inner_loop(int*, int, int);
int next(const int*, int, int);

int main() {
    int m, n;
    printf("请输入M和N(空格分隔):");
    scanf("%d%d", &m, &n);
    int king = monkey_king(m, n);
    printf("大王是:%d\n", king);
    return 0;
}

int monkey_king(int m, int n) {
    int monkeys[m];

    for(int i=0; i<m; i++)
        monkeys[i]=i;

    return inner_loop(monkeys, m, n)-monkeys;
}

int* inner_loop(int* idx, int m, int n) {
    int n_candidate = m;
    int current_idx = 1;
    while(n_candidate) {
        for(int i=1; i<=n; i++) {
            if(current_idx==n) //如果报数为N
                idx[current_idx-1] = 0; //出圈

            current_idx = next(idx, m, current_idx); //找出下一个猴子
        }
    }
    for(int i=0; i<n; i++) {
        if(idx[i])
            return idx+i;
    }
    return NULL;
}

int next(const int* idx, int m, int cur) {
    while(true) {
        if(cur<=m)
            cur++;
        else
            cur=1;

        if(idx[cur-1])
            return cur;
    }
}
  • 写回答

2条回答 默认 最新

  • bobhuang 2019-12-10 16:21
    关注
    #include <stdio.h>
    #define MAX_M 100
    #define MAX_N 100
    
    int monkey_king(int m, int n);
    int inner_loop(int *idx, int m, int n);
    
    int main() {
      int m, n;
      printf("请输入M和N(空格分隔):");
      scanf("%d %d", &m, &n);
      int king = monkey_king(m, n);
      printf("大王是:%d\n", king);
      return 0;
    }
    
    int monkey_king(int m, int n)
    {
      int monkeys[MAX_M];
      int i;
    
      for (i = 0; i < m; i++)
        monkeys[i] = 1; // 标记是否出圈, 0 - 出圈, 1 - 未出圈
    
      return inner_loop(monkeys, m, n);
    }
    
    int inner_loop(int *idx, int m, int n)
    {
      int n_candidate = m;
      int current_idx; // 报数序号
      int pos = 0;         // 报数的位置
    
      while (n_candidate) {
        // 找下一个未出圈的位置
        while (idx[pos] == 0) {
          pos = (pos + 1) % m;
        }
    
        current_idx = 1; // 从1开始报数
        while (current_idx < n) {
          // 找下一个未出圈的位置
          do {
            pos = (pos + 1) % m;
          } while (idx[pos] == 0);
          current_idx += 1;
        }
        // 当前位置出圈
        printf("%d ", pos + 1);
        idx[pos] = 0;
        n_candidate--;
      }
    
      return pos + 1;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!