用循环数组解决约瑟夫环问题

2021-05-07  本文已影响0人  cursorkey

N个人围成一圈顺序编号,从1号开始按1、2、3…顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推,按退出顺序输出每个退出人的原序号。

#define M 100    // M > N
void Joseph(int N, int p) {
    int queue[M];
    int head, tail, i;
    for (i = 1; i <= N; i++) {
        queue[i] = i;
    }
    head = 1;
    tail = N;
    i = 1;
    while (head != tail) {
        if (i != p) {
            tail = ++tail % M;
            queue[tail] = queue[head];
        }
        else {
            printf("%d ", queue[head]);
            i = 0;
        }
        i++;
        head = ++head % M;
    }
    printf("%d\n", queue[head]);
}
上一篇下一篇

猜你喜欢

热点阅读