7-34 (带注释) 猴子选大王 (20分)

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

输入格式:

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

输出格式:

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

输入样例:

11

输出样例:

7

我的代码:

// 整体思路:数组下标记录初始位置,循环修改数组值, 
// 直到修改了 N-1个数组值,剩下的就是所求值,输出数组位置即可。 
#include <stdio.h>
int main()
{
    
    
	int N;
	int j=1;
	scanf("%d",&N);                    // 接收数据。 
	int a[1100]={
    
    0};                   // 依据题意开出数组并初始化。 
	int js=0;                          // 尽量开的比给出的大些,防止越界和一些其他问题。 
	while (js<N-1)                     // js是用来记录去掉了几个数组元素的。 
	{
    
                                      // 有人可能会疑问:为什么是 js < N-1 ? 
		for(int i=1;i<=N;i++)          // 当 js 不满足条件时, js==N-1 ,即此时仅剩一个数组未被修改。 
		{
    
    
			if(a[i]==0)                // 只有数组还未被修改,才有资格参加评选。 
			{
    
    
				if(j==3)               // 数到三淘汰并初始化 j ,和记录淘汰数,同时取消该 
				{
    
                          // 数组的评选资格。 
					j=1;
					js++;
					a[i]++;
				}
				else                   // 记得要用 else 否则可能出现 j 多加的情况。 
				{
    
    
					j++;
				}
			}
		}
	}
	for(int i=1;i<=N;i++)              // 遍历数组,找出唯一未被修改的数组。 
	{
    
                                      
		if(a[i]==0)
		{
    
    
			printf("%d",i);            // 记住输出的是数组下标哦。 
		}                              // 我的编译器支持 c99 ,如果你的不支持,记得 
	}                                  // 将我在 for循环内定义的变量在外面定义就好了。 
}                                      

博主是刚学习的小白,如有谬误,还望斧正。
最后,各位看官,如果觉得写得不错,能不能给个赞啊。。

猜你喜欢

转载自blog.csdn.net/weixin_51304266/article/details/111035235