题目:
该题选自PTA基础题7-28,题目如下:
思路:
首先这题要求按顺序依次计数,从1~3依次报,报到3的就退出,然后继续报,报到3就退出,不是按一轮一轮进行的,所以我们不能简单的认为定义一个数组就好,然后%3==0的就退出,所以我们需要定义一个计数的变量flag,每次数一个就加1,当flag%3==0的数就是要退出的猴子,这里画一个简单的图来理解一下:
如上可以看出,括号中的值就是flag的值,能够被整除的数都可以被除掉,然后我们可以用while循环,只留最后一个数,当只剩一个数的时候就停止,最后再打印这最后一个数,就能解决这个问题了。
代码实现:(注释详解)
#include<stdio.h>
int main()
{
int N;
int flag = 0;
int zero = 0;
int arr[1000] = { 0 }; //将数组全部初始化为0,为了后续使用
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
arr[i] = i; //将“猴子”存在一个数组里
}
while (zero < N - 1) //当数组中0的个数小于N-1的时候,就执行,当zero为N-1的时候,说明只剩一个猴子了,就是猴王
{
for (int i = 1; i <= N; i++)
{
if (arr[i] == 0)
continue; //遇到有0的就跳过,从不是0的数字开始数123
flag++; //每次数了123就加1
if (flag % 3 == 0)
{
arr[i] = 0; //当能整除3时(也就是上面那个图片的括号内的数字)说明该猴子数到了3,就把这个数变为0,和上方初始化相同,就相当于这个猴子退出
zero++; //退出了一个猴子,zero就+1,为了能够将while循环停止
}
}
}
for (int j = 1; j <= N; j++)
{
if (arr[j] != 0)
printf("%d", arr[j]); //最后打印不是0的数字,也就是最开始的猴王的数字
}
return 0;
}
执行结果:
好的本期题目分享就到这,咱们下期见!!!!