约瑟夫问题(信息学奥赛一本通-2037)
【题目描述】
N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M
的人出圈;…输出依次出圈的人的编号。【输入】
输入N和M。
【输出】
输出一行,依次出圈的人的编号。
【输入样例】
8 5
【输出样例】
5 2 8 7 1 4 6 3
【提示】
【数据范围】
对于所有数据,2≤N,M≤1000。
【题解代码】
#include<iostream>
using namespace std;
const int N = 5e3 + 10;
int nums[N];
int num = 0;
int main()
{
int n, m;
cin >> n >> m;
int peo = n; //表示没出圈的人数
for (int i = 1; i <= n; i++) //下表为1表示没出圈
{
nums[i] = 1;
}
while (peo > 0)
{
for (int i = 1; i <= n; i++)
{
if (nums[i] == 1) //当前这个人没出圈
{
if (peo == 1) //只剩1个人了
{
cout << i;
return 0;
}
num++; //报数
if (num == m) //报到m的人出圈
{
nums[i] = 0; //该人出圈
cout << i << ' '; //将该人的编号输出
num = 0; //重新计数
peo--; //没出圈的人减少1个
}
}
}
}
return 0;
}