【2052】猴子选大王
Time Limit: 3 second
Memory Limit: 2 MB
【问题描述】
M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.(1<=m<=100)【输入】
两行,为两个正整数m,n
【输出】
m+1行。猴子们顺序出圈的号数和被选为大王的猴子的号数。
【输入样例】
83
【输出样例】
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;
}

浙公网安备 33010602011771号