0
点赞
收藏
分享

微信扫一扫

P1996 约瑟夫问题

大沈投资笔记 2022-02-17 阅读 91
c++算法

题目描述

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

注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n-1 名小朋友,而该题是全部出圈。

输入格式

输入两个整数 n,mn,m。

输出格式

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

输入输出样例

输入 #1复制

10 3

输出 #1复制

3 6 9 2 7 1 8 5 10 4

说明/提示

1 \le m, n \le 1001≤m,n≤100

解法1:

#include<iostream>
using namespace std;
const int N = 110;
int queue[N], index[N];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        queue[i] = i + 1;
        index[i] = i;
    }
    int num = 1, j = 0, i = 0;
    while (num <= n)
    {
        if (index[i % n] == -1)
        {
            i++;
            continue;
        }
        else if ((j % m) == m - 1)
        {
            cout << queue[index[i % n]] << " ";
            index[i % n] = -1;
            num++;
            j++;
            i++;
        }
        else
        {
            i++;
            j++;
        }
    }
    return 0;
}
举报

相关推荐

0 条评论