有 n n n 个小朋友做游戏,他们的编号分别是 1 , 2 , 3... n 1,2,3...n 1,2,3...n。
他们按照编号从小到大依次顺时针围成一个圆圈,从第一个小朋友开始从 1 1 1 报数,依次按照顺时针方向报数(加一),报 m m m 的人会离开队伍,然后下一个小朋友会继续从 1 1 1 开始报数,直到只剩一个小朋友为止。
输入格式
第一行输入俩个整数, n n n, m m m。( 1 ≤ n , m ≤ 1000 1 \leq n,m \leq 1000 1≤n,m≤1000)
输出格式
输出最后一个小朋友的编号,占一行。
样例输入
10 5
样例输出
3
解:
用一个队列即可完成,将报的数与
m
m
m取余,为0时只pop,其余的数操作pop前push(队头元素)。
代码:
#include"iostream"
#include"queue"
#include"algorithm"
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
queue<int> a;
int flag=0;//记录报数
for(int i=0;i<n;i++){
flag++;
if((i+1)%m==0)
continue;
a.push(i+1);
}
while(a.size()!=1){
flag++;
if(flag%m==0)//只踢不入
a.pop();
else {
a.push(a.front());
a.pop();
}
}
cout<<a.front()<<endl;
return 0;
}