报数游戏

100个人围成一圈,给每个人贴上一个数字标签,序号为1到100,他们开始从1报数,报数数字为7的倍数时,这个人报完数从圈里面淘汰,下一个人接着继续报数。报完一圈时继续,只要圈里面还有人,就要接着报数,报数为7的倍数继续淘汰,如此循环,直到最后剩下一个人,请编写程序,输出最后剩下这个人的编号是多少?

答:今后从中间删值的问题,都考虑用两个容器进栈出栈,或进队列,出队列。本题正确方法是用两个容器,出队列、进队列,中间过程中删掉7的倍数的元素。实现如下:

int _tmain(int argc, _TCHAR* argv[])
{
    queue 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;
}

你可能感兴趣的:(报数游戏)