洛谷P1996 约瑟夫问题

题目描述

n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从1开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

输入格式

输入两个整数n,m。

输出格式

输出一行 n 个整数,按顺序输出每个出圈人的编号。

输入输出样例

输入 

10 3

输出

3 6 9 2 7 1 8 5 10 4

说明/提示

1≤m,n≤100

参考代码

#include
#include
using namespace std;
int main(){
    int n, m;
    cin >> n >> m;
    vector nums(n, 0);
    vector ans;
    for (int i = 0; i < n; ++i)
        nums[i] = i + 1;
    int index = 0; // 添加一个变量来记录当前的位置
    while (!nums.empty()) {
        index = (index + m - 1) % nums.size(); // 计算下一个要删除的元素的位置
        ans.push_back(nums[index]);
        nums.erase(nums.begin() + index);
    }
    for (int i = 0; i < ans.size(); ++i)
        cout << ans[i] << " ";
    return 0;
}

题目链接

1996 约瑟夫问题

你可能感兴趣的:(洛谷,算法)