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; }