一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
代码:
#include<stdio.h>
int main()
{
int n;
int a[1005]={0};//用a来判断猴子的死亡
int i,shu=0,j;//shu用来计算数的数
scanf("%d",&n);
for(i=1;i<n;)//只需要循环n-1次,此时会只剩下一个猴子
{
for(j=1;j<=n;j++)
{
if(a[j]==0)
{
shu++;
if(shu==3)
{
a[j]=1;//如果猴子死亡,则a[i]=1
i++;//i表示猴子死亡的数量,只有存在猴子死得时候i++
shu=0;//重置shu的取值
}
}
}
}
for(i=1;i<=n;i++)
{
if(a[i]==0)
{
printf("%d",i);
break;
}
}
return 0;
}
附解析:i++在循环里面的原因就是只有存在猴子死亡的情况,i才会加1;如果在从j=1到j=n没有猴子死亡的情况,则i的值不变,会在进行遍历,直到i=n-1(即只剩下1个猴子时),此时所有死的猴子的a[i]=1,没死的为a[i]=0;因此只需找到a[i]=0的数输出就可以完成了。
!!!一个相关的视频,希望对你有点启发: