沃瑟夫问题 沃瑟夫问题

有 n 个人排成一圈,从 11 到 n 编号。从第一个人开始依次报数(第一个人报的数是 1,下一个人报的数是 2,当前这个人报的数字等于前面那个人报的数字加一),报数一共进行 n 轮,对于第 i (1≤i≤n) 轮,数到 i2 的人出列,下一个人继续从 1 开始报数结束的时候所有人都会出列

请依次输出每一轮出列的人的编号


#include <bits/stdc++.h>
using namespace std;
const int se = 5001;
int n, m, q[se + 1], front = 1, rear = se;
int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        rear = rear % se + 1;
        q[rear] = i;
    }
    int x = 0, k = 1, psum = 0;
    while (rear % se + 1 != front){
        psum = n - k + 1;
        ++x;
        int y = q[front];
        front = front % se + 1;
        m = k * k % psum;
        if (m == 0){
            printf("%d ", q[rear]);
            ++k;
        } else {
            if (x == m){
                printf("%d ", y);
                x = 0;
                ++k;
            } else {
                rear = rear % se + 1;
                q[rear] = y;
            }
        }
    }
    return 0;
}

输入
10
输出
1 5 6 8 9 10 2 3 4 7

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^