题目描述
n 个人围成一圈,从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,mn,m。
输出格式
输出一行 nn 个整数,按顺序输出每个出圈人的编号。
输入
10 3
输出
3 6 9 2 7 1 8 5 10 4
方法一,简单模拟
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
bool visit[110];
int n,m,s;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){ //n人 一共要出队n次
for(int j=1;j<=m;j++)
{
s++; //依次报数
if(s>n)//n个人报完 第一个人报
s=1;
if(visit[s])
j--;
}
printf("%d ",s);
visit[s]=true;
}
}
方法二,队列
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
int main()
{
int n,m,now=0;
queue<int>q;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) q.push(i);//初始化队列
while(!q.empty())
{
now++;
if(now==m)
{
printf("%d ",q.front());
q.pop();
now=1;
}
else
{
q.push(q.front());//排至队尾
q.pop(); //删除队列首元素
}
}
}