约瑟夫问题(信息学奥赛一本通-2037)

【题目描述】

N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M
的人出圈;…输出依次出圈的人的编号。

【输入】

输入N和M。

【输出】

输出一行,依次出圈的人的编号。

【输入样例】

8 5

【输出样例】

5 2 8 7 1 4 6 3

【提示】

【数据范围】

对于所有数据,2≤N,M≤1000。

【题解代码】

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

你可能感兴趣的:(信息学奥赛一本通,算法)