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

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]);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容