Time Limit: 3 second
Memory Limit: 2 MB

【问题描述】

M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.(1<=m<=100)

【输入】

两行,为两个正整数m,n

【输出】

m+1行。猴子们顺序出圈的号数和被选为大王的猴子的号数。

【输入样例】

8
3

【输出样例】

   3(这里的每个数字占场宽4)
   6
   1
   5
   2
   8
   4
the king is:7(单词之间空格数为1)

【题解】

用一个while rest != 1来判断结束。

在while中嵌套一个for  1 - n 表示报n次数。用bo数组来判断某猴子是否出圈。要用while 来找未出圈的下一只猴子。

//在引号前面多按了个空格。以后一定要避免这种低级错误啊!

【代码】

#include <cstdio>

int m,n,rest;
bool bo[150];

void input_data()
{
    scanf("%d",&m);
    scanf("%d",&n);
    for (int i = 1;i <= m;i++)
        bo[i] = true;
}

void get_ans()
{
    rest = m;
    int i = 1;
    while (rest != 1) //如果剩余猴子数量不为1
        for (int j = 1;j <= n;j++) //报n次数
            {
                while (bo[i] == false) //找下一只未出圈的猴子
                    {
                            i++;
                            if (i > m) i = 1;
                    }
                if (j == n) //如果报到n了 就让这只猴子出圈
                    {
                            printf("%4d\n",i);
                            bo[i] = false;
                            rest--;
                    }
                i++; //先到下一只,具体是哪一只用上面的while 来找
                if (i > m) i = 1;
            }
    for (int i = 1; i <= m;i++)
        if (bo[i])
            {
                printf("the king is:%d",i);
                break;
            }
}

int main()
{
    input_data();
    get_ans();
    return 0;
}