#include<iostream>
using namespace std;
bool a[101] = { 0 }; // 创建一个布尔数组a,用于记录每个人是否已经出圈。数组大小为101,因为n的最大值为100。
int main()
{
int n, m, cont = 0, i = 1, j, num = 0; // 声明变量n(人数),m(报数上限),cont(当前报数),i(当前考虑的人的编号),num(已经出圈的人数)。
cin >> n >> m; // 从标准输入读取n和m的值。
while (1) // 开始一个无限循环,直到所有人都出圈。
{
if (a[i] == 1) // 检查当前编号的人是否已出圈。
{
i++; // 若已出圈,则考虑下一个人。
if (i > n) // 如果超过了总人数,从头开始。
i = 1;
continue; // 跳过下面的代码,继续下一轮循环。
}
cont++; // 当前未出圈的人报数增加。
if (cont == m) // 如果报数达到m。
{
cont = 0; // 重置报数。
cout << i << ' '; // 输出当前编号的人。
a[i] = 1; // 标记此人已出圈。
num++; // 出圈人数增加。
if (num == n) // 如果所有人都已出圈。
return 0; // 结束程序。
}
i++; // 考虑下一个人。
if (i > n) // 同样,如果超过了总人数,从头开始。
i = 1;
}
}
在这段代码中,核心思想是通过一个布尔数组来跟踪每个人是否已经出圈。程序使用一个无限循环来模拟整个报数过程,每当一个人的报数达到指定的上限时,他就会被标记为出圈,并且程序会输出他的编号。这个过程一直持续到所有人都被标记为出圈。这种方式高效地解决了约瑟夫问题,同时代码也具有一定的灵活性,可以应对不同的n和m值。