您的位置:首页 > 其它

1015: 【出圈】

2016-03-05 11:15 225 查看
题目描述
设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。

输入
输入多行,每行2个数,分别表示n和m.

输出
计算每一行中最后剩下这个人的编号.

样例输入
10 3
样例输出
4

#include <iostream>

using namespace std;
int person[100];

int main()
{
    int n, m, inside;

    while(cin>>n>>m)
    {
        inside = n;
        for(int i = 0; i <  n; i++)
        {
            person[i] = 1;
        }

        int num = 0, rear = 0;

        for(;;)
        {
            while(num != m)
            {
                if(person[rear % n] == 1)
                {
                    num++;
                    rear = (rear + 1) % n;
                }
                else
                {
                    rear = (rear + 1) % n;
                    //person[rear % n]为0的时候,只要将rear往后移一个,其他不变
                }
            }
            if(num == m)
            {
                if(rear == 0)
                {
                    person[n-1] = 0;
                    num = 0;
                    inside--;
                     //如果是最后一个为1,而num已经达到m,此时,因为rear已经变成了0,
                    //所以要将最后一个赋值为0的情况
                }
                else
                {
                    person[rear - 1] = 0;
                    num = 0;
                    inside--;
                   
                }
            }
            if(inside == 1)break;
        }
        for(int i = 0; i < n; i++)
        {
            if(person[i] == 1)
            {
                cout<<i+1<<endl;
                break;
            }
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: