约瑟夫环类问题

n个人围成一个圈,从1开始对n个人编号,现在从1号开始报数,报到m的人出圈,之后从出圈后一位的人开始报数,重复直到所有人出圈,请按序输出出圈的人的编号

https://www.bilibili.com/video/BV1so4y1o7KJ?p
法一:
#include<iostream>
using namespace std;

const int N = 110;
int a[N];

int main()
{
    int n, m;
    cin >> n >> m;
    int cnt = 0, i = 0, k = 0;

    while (cnt != n)
    {
        ++i;
        if (i > n)  i = 1;
        if (a[i] == 0)
        {
            ++k;
            if (k == m)
            {
                a[i] = 1;
                ++cnt;
                cout << i << ' ';
                k = 0;
            }
        }
    }

    return 0;
}

法二:
#include<iostream>
using namespace std;

int ysf(int n, int k, int i)    //表示由n个人,报到数字k时出局,第i个出局的人的编号
{
    if (i == 1)
    {
        return (k - 1 + n) % n;
    }
    else
    {
        return (ysf(n - 1, k, i - 1) + k) % n;
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        cout << ysf(n, m, i) + 1 << ' ';
    }

    return 0;
}
全部评论

相关推荐

贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 77人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务