数组-11. 猴子选大王(20)


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

输入格式:

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

输出格式:

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

输入样例:
11
输出样例:
7
C程序:
 
 
#include 
    
    
     
     
int main(void) {
	int next[1000];	/* 用于保存一个猴子后一位是谁 */
	int prev[1000];	/* 用于保存一个猴子前一位是谁 */
	int n;
	int i, current;
	int prior, back;
	scanf("%d", &n);
	for(i = 0; i < n - 1; ++i) {
		next[i] = i + 1;	/* 0号猴子的下一位是1号猴子... */
		prev[i + 1] = i;	/* 1号猴子的前一位是0号猴子... */ 
	}
	next[n - 1] = 0;		/* 形成圆圈,第n-1号猴子的下一位是0号猴子 */ 
	prev[0] = n - 1;		/* 形成圆圈,第0号猴子的下一位是n-1号猴子 */
	current = 0;
	while(1) {
		/* 报3次号,取3-1次next之后就是要退出的猴子 */ 
		for(i = 0; i < 3 - 1; ++i) {
			current = next[current];				
		}
		prior = prev[current];	/* 要退出的猴子的前一位猴子 */
		back = next[current];	/* 要退出的猴子的下一位猴子 */
		/* current号猴子退出 */
		/* 前一位prior的下一位指向current的下一位back */
		/* 下一位back的前一位指向current的前一位prior */ 
		next[prior] = back;
		prev[back] = prior;
		/* 如果剩下两个猴子,每个猴子的前一位和下一位是同个猴子 */
		/* current(back)是要退出的猴子,剩下的就是猴王(prior)*/ 
		if(prior == back) {
			printf("%d\n", prior + 1);	/* 编号从0开始,输出时加1 */ 
			break;
		}
		current = back; 
	}
	return 0;
}

    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值