代码如下:(我只敲了对单行的判断输出,多组数据的话再加循环就行了,懒得再想了,困了困了,代码让人忘记时间)
#include<stdio.h>
int main()
{
int m, n, i, j, k, p, N, h[301] = { 0 };
scanf_s("%d %d", &n, &m);
N = n;
for (i = 0; i < n; i++)
h[i] = i + 1;
if (m > n)
do m -= n;
while (m > n);
else
{
j = 1;//j可看作报数
for (k = 0; k < n; k++)
if (h[k] == m)
{
p = k;//p此时表示报数为m的猴子位置
N--;//注意这个N,用来计数,表示剩余猴子的数量
h[k] = 0;//赋值0表示这个位置没猴子了
break;
}//这个放在外面,一次判断就可以
for (i = 0; i < n; i++)
{
for (k = p+1; j<=m&&k < n; k++)//注意这个循环的位置,是p+1到末尾
{
if (h[k] == 0)//判断所遍历的位置还有没有猴子
continue;
else if (j == m)
{
p = k;
h[k] = 0;
N--;
j = 1;
continue;
}
else
{
h[k] = j;
j++;
}
}
for (k = 0; j<=m&&k < p; k++)//这个循环从开头到p-1
{
if (h[k] == 0)
continue;
else if (j == m)
{
p = k;
h[k] = 0;
N--;
j = 1;
continue;
}
else
{
h[k] = j;
j++;
}
}
if (N == 1)//只剩一个猴子的时候,停止
break;
}
}
for (i = 0; i < n; i++)
if (h[i])
printf("%d\n", i + 1);
}