7-8 猴子选大王 (20 分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

 

#include <stdio.h>

int main()
{//0:不参与;  1:参与
	int N;
	scanf("%d", &N);
	int a[N];            
	int i;               
	for (i=0; i<N; i++)
	{
		a[i]=i+1;
	}//7-12行代码可改为;int a[N+1] 然后再对数组内的元素赋值,相当于是n+1个数但只用下标为1--n的数组元素,相当于a[0]不用
	//即:int a[N+1];
	  //  int i; 
	   // for(i=1;i<=N;i++)
	   // {
	    //	a[i]=i;
		//}
	//后续循环变量i相应地改为i=1开始 
	int elimination = 0; //淘汰变量 报数1,2,3
	int remainder = N; //剩余变量 
	while (remainder > 1)
	{
		for (i=0; i<N; i++)
		{
			if (a[i] == 0) 
			{
				continue; 
			}
			//序号为0的猴已淘汰,不计数,直接进入下一轮循环 
			elimination++;
			if (elimination == 3)
			{
				a[i] = 0; //淘汰之后的猴子序号设为0 
				elimination = 0; //淘汰变量重置 
				remainder--; //剩余猴数减1 
			}
		}
	}
	for (i=0; i<N; i++)
	{
		if (a[i] != 0)
		{
			printf("%d\n", i+1);
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值