一群猴子要选新猴王。新猴王的选择方法是:让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循环内定义的变量在外面定义就好了。
}
博主是刚学习的小白,如有谬误,还望斧正。
最后,各位看官,如果觉得写得不错,能不能给个赞啊。。