洛谷p1996 约瑟夫问题(c++)

洛谷p1996 约瑟夫问题(c++)_第1张图片

#include
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值。

你可能感兴趣的:(c++,开发语言)