有n个人围成一圈(编号为1~n),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号?
输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(5≤n≤100)。
输出格式:
对于每组测试,输出最后剩下那个人的编号。
输入样例:
10
28
69
输出样例:
4
23
68
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
while(cin>>n)
{
int i;
queue<int> qu;
for(i=1;i<=n;i++)
{
qu.push(i);
}
int cnt=0;
int k=3;
while(qu.size()>1) //只剩下最后一个元素
{
cnt++;
int x=qu.front();
if(cnt==k)
{
qu.pop(); //等于三时,直接删除队首
cnt=0; //将cnt清零,重新记数
}
else
{
qu.push(x); //把队首插入到队尾
qu.pop(); //删除队首
}
}
cout<<qu.front()<<endl; //输出队首,此时循环完毕,队列也就只剩了最后一个元素
}
return 0;
}