约瑟夫问题
题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 11 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
样例 #1
样例输入 #1
10 3
样例输出 #1
3 6 9 2 7 1 8 5 10 4
提示
1≤m,n≤100
题解
首先,我们定义几个变量,包括n(人数)、m(报数到m的人出列)、ae(剩余未出列的人数)、x(用于循环计数)、p(用于报数计数)、id(当前报数到的人的编号)、e(用于记录是否出列的数组)。
然后,我们通过循环遍历所有人出列的过程。每次循环,我们通过id=id%a+1来确定当前报数到的人的编号,同时判断该人是否已经出列(e[id]!=1)。如果该人还没有出列,我们将p加1,并判断p是否等于m。如果p等于m,说明该人需要出列,我们输出该人的编号,并将e[id]=1表示该人已出列,然后将p重置为0,并将ae减1,表示剩余的未出列人数减1。循环直到ae等于0,即所有人都出列。
最后,我们输出所有出列人的编号。
#include<bits/stdc++.h>
using namespace std;
long long a,b,ae,x=0,p=0,id,e[1000000+250];
int main()
{
cin>>a>>b;
ae=a;
while(ae>0)
{
id=id%a+1;
if(e[id]!=1)
p++;
if(p==b)
{
cout<<id<<" ";
e[id]=1;
p=0;
ae--;
}
}
return 0;
}