【问题描述】要从n只猴子中选出一位大王。它们决定使用下面的方法:
n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。
【输入形式】控制台输入三个整数n,m,q。
【输出形式】输出最后选为大王的猴子编号。
【样例输入】
7 4 3
【样例输出】
4
【样例说明】输入整数n = 7,m = 4,n = 3,输出4
将没有被淘汰的猴子标为0,将已淘汰的猴子标为1。对n只猴子进行比较时,总共会进行(n-1)轮报数,在每轮报数中如果猴子的值为0,则下标加1并且b加一(b被用来使每轮报数的猴子不超过m只),下只猴子报数;如果猴子为1,则b不变,下标加一,下只猴子报数。直到每轮的m只猴子都进行了报数即b等于m时,将最后一只猴子淘汰标为1。
如果猴子的下标超过猴子总数,将猴子的下表赋值为0,当下表q再进入循环时会进行q++操作,所以q会等于1即又从第一只猴子开始报数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n, m, q, i, b, c, d, a[50] = { 0 };//将所有数组定义为0
scanf("%d %d %d", &n, &m, &q);//输入变量
for (i = 0; i < n - 1; i++)//对于n只猴子需要比较(n-1)次
{
for (b = 1; b <= m; q++)//被选中的猴子进行报数
{
if (q <= n)//如果猴子下标没有超过猴子总数,则进行下一步
{
if (a[q] == 0)//如果这只猴子没有被淘汰则可进行报数
{
if (b == m)//如果这只猴子是第m只猴子,则淘汰
a[q] = 1;
b++;
}
}
else { q = 0; }//如果猴子下表超过猴子总数,就将猴子下表改为0,载进入循环时因为q++,q会等于1,则代表从第一只猴子开始继续进行
}
}
for (d = 1; d <= n; d++)
if (a[d] == 0)//输出没有被淘汰的猴子下标
printf("%d ", d);
}