关于c++的约瑟夫问题

沃瑟夫问题
有 n 个人排成一圈,从 1 到 n 编号。从第一个人开始依次报数(第一个人报的数是 1,下一个人报的数是 2...,当前这个人报的数字等于前面那个人报的数字加一),报数一共进行 n 轮,对于第 i (1<=i<=n) 轮,数到 i^2 的人出列,下一个人继续从 1 开始报数。结束的时候所有人都会出列。
请依次输出每一轮出列的人的编号。

输入格式
第一行一个整数 n
输出格式
输出一行,包含 n 个数,表示每一轮出列的人的编号

样例输入

10

样例输出

1 5 6 8 9 10 2 3 4 7

数据规模
对于 100% 的数据,保证 1≤n≤5000。
以下代码m==0的地方处理错了,我觉得不应该直接输出队尾,有没有big佬帮忙改一改,谢谢

#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;
}

这题我会,代码如下,希望采纳:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n+1]={0};
    for(int i=1;i<=n;i++) a[i]=i; 
    int num=n;//num为剩余人数 
    int count=1;//count为当前要报的数字 
    int tmp=0;//tmp为当前该哪个位置报数了 
    int l=1;//l表示当前是第几轮 
    while(num!=0)    
    {
        tmp++;
        if(tmp>n) tmp=1;
        int val=pow(l,2);
        if(a[tmp]!=-1)
        {
            if(count==val)
            {
            cout<<a[tmp]<<" ";
            a[tmp]=-1;
            l++;
            num--; 
            count=0;
            }
            count++;
        }
        
        
    }
    return 0;
}



```c++
#include<bits/stdc++.h>
using namespace std;
int n,m,t,j,a[10001];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n-1;i++)
    {
        t=0;
        while(t<m)
        {
            if(j==n)
            j=0;
            j++;
            if(a[j]==0)
            t++;
        }
        a[j]=1;
        cout<<j<<" ";
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]==0)
        {
            printf("%d",i);
            return 0;
        }
    }
 } 

```