约瑟夫环问题

题目简述:让一群人围成一圈从1开始报数, 报到指定数字的人出圈,然后再重新从1开始报数,最后一个没出圈的人就是“大王”。
按照题目模拟即可,利用 i = i % n + 1 来造一个圈。
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 110;

int n, k, m;

int main()
{
	cin >> n >> k >> m;
	int a = n;  //记录剩余人数
	int i = k;  //指针,指向当前正在报数的人
	int count = 1; //记录目前报数报的是几
	int arr[N] = { 0 }; //出圈的人标记一下

	while (a > 1)
	{
		if (count == m)
		{
			arr[i] = 1;
			count = 0;
			a--;
		}
		else
		{
			i = i % n + 1;
			count++;
			while (arr[i] == 1)
			{
				i = i % n + 1;
			}
		}
	}
	for (int i = 1; i <= n; i++)  //找到那个没出圈的人然后直接输出下标即可
	{
		if (arr[i] == 0)
			cout << i << endl;
	}
	return 0;
}