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

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

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

handsomezqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值