猴子选大王(从第q个开始)C语言

 【问题描述】要从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);
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值