题目描述:有n只猴子按顺时针方向围成一圈选猴王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数,就这样,直到圈内只剩下一只猴子时,这只猴子就是猴王,编程输入n和m,输出猴王的编号。
#include<stdio.h>
int main()
{
int n, m,i;
scanf("%d %d", &n, &m);
int a[300];//这里会给出一个限制,不一定是300
int pas = 0;//表示淘汰的猴子数
int num = 0;//表示没有被淘汰的猴子的报数次数
for (i = 1; i <= n; i++)//开始时每只猴都可以报数,为了能得到最后一只猴的编号,我们让初始值为i下标
{
a[i] = i;
}
for (i = 1;; i++)
{
if (i > n)
{
i = 1;//大于总个数,就从头开始
}
if (a[i] > 0)//表示这只猴没被淘汰,就报数次数增加
{
num++;
}
if (m == num && pas != n - 1)//表示这只猴报的数等于m 并且剩下的还有多只猴
{
num = 0;
a[i] = 0;
pas++;
}
else
{
if (m == num && pas == n - 1)//表示这只猴报数等于m,并且仅剩一只猴,说明当前这只猴子就是大王了
{
printf("%d", a[i]);
break;
}
}
}
return 0;
}