加载中...

P1996 约瑟夫问题

P1996 约瑟夫问题

约瑟夫问题

题目描述

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

输入格式

输入两个整数 n,m。

输出格式

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

样例 #1

样例输入 #1

10 3

样例输出 #1

3 6 9 2 7 1 8 5 10 4

提示

1 ≤ m, n ≤ 100

分析

其实,此题就是一个模拟题。按照题意去做,用visit记录下已经出队了的人,然后模拟,一个个的加就行了。

还要注意,一开始,加的数要赋值为0。还有visit数组要开始全部赋值为false(早就知道了?我第一遍就忘了……)

提交答案

#include<cstdio>
using namespace std;
int main()
{
    int n,m,s=0;scanf("%d%d",&n,&m);//入读
    bool visit[200]={0};//visit赋初始值
    for(int k=0;k<n;k++){//总共要出队n次
        for(int i=0;i<m;i++){if(++s>n)s=1;if(visit[s])i--;}//类似取模,而因为序列是从1开始的,所以不取模,加判断;若visit过,则i--,使其继续循环
        printf("%d ",s);visit[s]=true;//输出,记录已出队
    }
    return 0;
}
posted @ 2023-03-09 23:28  bujidao1128  阅读(25)  评论(0)    收藏  举报