猴子当大王

题目描述:m只猴子,选择一位大王,要求按照序号1、2、3…m排序,从1开始报数,若报到n,则出局,并从下只猴子开始继续由一报数,以此类推。最后剩下的猴子成为大王。
思路分析:由具体到一般,选择一种比较简单的情况来分析,并将其全过程简单模拟,以便得到思路。
举个例子:有7个猴子,当报到3时退出。利用还原法分析该过程:猴1报1,猴2报2,猴3报3,出局!以上过程我可以模拟为设置一个循环,循环变量i从1开始累加,那么i对应了猴子的序号,那么报的号怎样模拟呢?可以再设置变量j,每报一次就执行一次j++,如果报的数等于了3,就意味着猴子出局,怎么模拟出局呢?我想着利用序号对应的数组元素的值来规定其是否出局。具体地来说呢,就是假如说猴3本应出局的,我提前设置一个int型数组a并将其所有元素初始化为0,若猴3出局,则a[3]=0。即通过使得序号对应的数组元素的值改变来模拟猴子出局。那么我每次使得猴子报数前我必须判断其是否出局,只有没出局的猴子才有报数的机会,那就判断其序号对应数组元素的值从而判断其是否出局。如果遇到了已出局的猴子就不需要报数,即不需要处理。若报数刚好到了指定数即本例中的数字3,那么猴3出局,即a[3]=0,并且重置j的值为0,此外还要调整剩余未出局的猴子数量,即p–。最后还有一个需要模拟的,就是报数尽头需要从第一只猴子继续报,这个比较好想,若i==7,则立即将i赋值为0,开启下一次循环前会执行i++,因此下一次报数会从猴1(若猴1未出局)开始。此番反复,最后只会剩下一个猴子,而此时p=1,我的循环也会结束,最终我只需将未出局那只猴子序号输出即可。

if(a[i]==0)
	j++;

以上就是我模拟未出局猴子报数的代码

if(j==n)
		{
			a[i]=1;
			j=0;
			p--;
		}

以上为我模拟的猴子出局的代码

if(i==m)
	i=0;

以上为边界转换代码

#include<stdio.h>
int main()
{
	int j=0,i,m,n,a[1000]={0};
	scanf("%d%d",&m,&n);
	int p=m;
	for(i=1;p!=1;i++)
	{
		if(a[i]==0)
			j++;//未出局猴子报数过程
		if(j==n)
		{
			a[i]=1;
			j=0;
			p--;//猴子出局过程
		}
		if(i==m)
			i=0;//边界处理过程
	}
	for(i=1;i<=m;i++)
		if(a[i]==0)
			printf("%d\n",i);//输出猴王序号过程
	return 0;
}码片
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值