题解 | 约瑟夫环

约瑟夫环

https://www.nowcoder.com/practice/e417cfe32c74416ca38247f619ddb322

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, k, m;
    scanf("%d %d %d", &n, &k, &m);
    int xuhao = k;
    int eliminated = 0; // 已淘汰人数

    // 动态分配数组,大小为n(只需记录n个人的状态)
    int *num = (int *)malloc(n * sizeof(int));
    if (num == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    for (int temp = 0; temp < n; temp++) {
        num[temp] = 1; // 初始所有人都在队
    }

    // 淘汰n-1人(保持你循环n-1次的逻辑)
    while (eliminated < n - 1) {
        int step = 0;
        // 找到第m个在队的人(跳过已淘汰的)
        while (step < m) {
            if (num[xuhao] == 1) {
                step++;
            }
            if (step == m) break;
            xuhao = (xuhao + 1) % n; // 环形移动,确保在0~n-1范围
        }
        // 标记淘汰
        num[xuhao] = 0;
        eliminated++;
        // 移动到下一个起始位置
        xuhao = (xuhao + 1) % n;
    }

    int arr[n];
    for (int temp = 0; temp < n; temp++) {
        arr[temp] = 0;
    }
    // 记录淘汰位置(因num大小为n,直接用索引即可)
    for (int temp = 0; temp < n; temp++) {
        if (num[temp] == 0) {
            arr[temp] = temp;
        }
    }
    // 输出未淘汰的位置
    for (int temp = 1; temp < n; temp++) {
        if (arr[temp] == 0) {
            printf("%d", temp);
        }
    }

    free(num);
    return 0;
}

全部评论

相关推荐

03-12 15:35
嘉应学院 Python
M_地球online...:真“boss直聘”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务