题目是这样的:
题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入
输入两个整数n和m,1<=m<=n<=100。
输出
输出猴王的编号
样例输入 Copy
8 3
样例输出 Copy
7
来源/分类
问题是测试时有一组数据答案错误:
//用的笨方法,若有更好思路,求指点
//这个是测试用的工程文件,于是把常用的头文件都打上了,可能有多余的
#include<stdio.h>
#include<stdlib.h>
#include <limits.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
int main()
{
int n, m;
int k, s, i = 1;
scanf("%d %d", &n, &m);
if(n == 1)//只有一个猴子,直接称王
printf("1");
else
{
int r = n;
int number[101];
for (int j = 0; j < 101; j++) number[j] = 1;
while (n > 1)
{
s = 0;
for (i; i < r + 1; )
{
if (number[i] == 0)//当前位置的猴子被淘汰了,跳过
{
i %= r;
i++;
continue;
}
else s++;//计数=1
if (s == m)//当数了m个数时
{
number[i] = 0;//当前位置的猴子淘汰
i %= r;
i++;
n--;//总猴子数量-1
break;
}
i %= r;
i++;
}
if (n == 1)//只剩下1个猴子时,结束
{
for (int t = 1; t <= r; t++)//寻找那个猴子
{
if (number[t] == 1)
{
k = t;
break;
}
}
}
}
printf("%d", k);//输出
}
return 0;
}
经典约瑟夫环问题变形
#include<stdio.h>
int a[105];//数组的a[i]表示第i个人是否出局,1表示出局,0表示未出局
int main() {
int n, m, i = 1; //i表示猴子编号,从1~n
scanf("%d %d", &n, &m);
int t = 0; //表示当前的猴子报的数
int s = 0; //表示当前出局的人数
while(s != n) {
if(a[i] == 0) { //猴子未出局才允许报数
t++; //报数+1
if(t == m) { //若猴子报数为m
a[i] = 1;//该猴出局,标记为1
s++; //出局人数+1
if(s == n) { //若此次出局的猴子是最后一只猴,输出
printf("%d ", i);
}
t = 0; //从1重新开始报数
}
}
i++; //不管上一个猴出没出局,都轮到下一个猴
if(i > n) { //若到了最后一个猴,回到第一个猴
i = 1;
}
}
return 0;
}