100个人围成一圈,给每个人贴上一个数字标签,序号为1到100,他们开始从1报数,报数数字为7的倍数时,这个人报完数从圈里面淘汰,下一个人接着继续报数。报完一圈时继续,只要圈里面还有人,就要接着报数,报数为7的倍数继续淘汰,如此循环,直到最后剩下一个人,请编写程序,输出最后剩下这个人的编号是多少?
答:今后从中间删值的问题,都考虑用两个容器进栈出栈,或进队列,出队列。本题正确方法是用两个容器,出队列、进队列,中间过程中删掉7的倍数的元素。实现如下:
int _tmain(int argc, _TCHAR* argv[])
{
queue<int> que1,que2;
for(int i=1; i<=100; i++)
{
que1.push(i);
}
int reportnum = 0; //记录报数的变量
while(que1.size()>1 || que2.size()>1)
{
while(que1.size()>0)
{
int tmp = que1.front();
que1.pop();
reportnum++;
if (reportnum%7 != 0)
{
que2.push(tmp);
}
}
while(que2.size()>0)
{
int tmp = que2.front();
que2.pop();
reportnum++;
if (reportnum%7 != 0)
{
que1.push(tmp);
}
}
}
int num = -1;
if(que1.size()>0)
num = que1.front();
else if(que2.size()>0)
num =que2.front();
return 0;
}