关于#c++#的问题:约瑟夫环问题

设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他顺时针方向上的下一个人起重新自1起顺序报数,报m的人出列,并将他的密码作为新的m值;如此下去,直到所有人全部出列为止。

设计一个程序模拟此过程,并给出出列人的编号序列。

#该怎么把每个人的顺序放到新数组里呢?

不需要建立新数组,出局的人只需要设定一个标志量就可以了。再定义一个变量记录当前还有多少人没出局。

struct man
{
    int m;
    bool k;
};
int main()
{
    srand(time(NULL));
    struct man s[100];
    int n,i,m,now;
    cin>>n>>m;
    now = n;
    for(i=0;i<n;i++)
    {
        s[i].m = rand()%5+1;
        s[i].k = true;
    }
    i=0;
    while(now > 0)
    {
        int count = 0;
        while(1)
        {
            if(s[i].k)
            {
                count++;
                if(count == m)
                {
                    s[i].k = false;
                    m = s[i].m;
                    cout<<i+1<<" "<<m<<endl;
                    now--;
                    i++;
                    if(i>=n)
                        i=0;
                    break;
                }
            }
            i++;
            if(i>=n)
                i=0;
        }
    }
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632