原题链接:[编程入门]报数问题
解题思路:
将数组的元素值赋值为0(即没有被淘汰),被淘汰赋值为1.
然后while循环一直循环,打印输出了数据。
while里面再来个for循环,一直遍历整个数组
通过创建三个变量来记录和修改淘汰的数组元素
通过if判断来记录并修改
int num, count,num1;//变量1:记录被淘汰数。变量2:记录每个没被淘汰的人的报数。变量3:记录被淘汰的人的在数组中的位置
注意事项:
输出的时候对元素有要求,如下
if(num==(n-1)&&arr[i]!=1)//最后淘汰人数达标,并且此时被遍历的这个数组元素(可能是被淘汰的,也可能是没被淘汰的)没被淘汰,即值不为1,就输出
记录要被淘汰的元素也有要求,如下:
if (count == 3)//报数达标,记录这个元素的数组下标!!!!(因为下一次循环就不是报数为三的元素了,可能是被淘汰的,也可能是没被淘汰的) { num1 = i; }
一直用if才会每一次for循环都对每一个if语句进行判断,else if不一定会
参考代码:
#include<stdio.h> void test42(int n) { //报数问题 //有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数), //凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 int*arr=(int*)malloc(sizeof(int) * n); memset(arr, 0,n); int num, count,num1;//变量1:记录被淘汰数。变量2:记录每个没被淘汰的人的报数。变量3:记录被淘汰的人的在数组中的位置 num = num1=count=0; int isNoPrint = 1;//是否打印了编号(若不设置,输入的数为三的整数倍时不会输出数据) while(num!=n-1||isNoPrint)//循环查找(满足条件之一:1、被淘汰的人数不够;2、没有输出数据) { for(int i=0;i<n;i++)//一直遍历数组每个元素 { if(count==3 && num != (n - 1))//若报数达到三,则 { count = 0;//将报数置为0 arr[num1] = 1;//更改报数为3的数组元素(先前有记录其下标,num1) num++;//淘汰的人+1 } if(count!=3&&arr[i]!=1&&num!=(n-1))//若报数不为3,此时的这个数组的元素也没被淘汰,淘汰人数也不达标。 { count++;//就可以报数 } if (count == 3)//报数达标,记录这个元素的数组下标!!!!(因为下一次循环就不是报数为三的元素了,可能是被淘汰的,也可能是没被淘汰的) { num1 = i; } if(num==(n-1)&&arr[i]!=1)//最后淘汰人数达标,并且此时遍历的这个数组元素(可能是被淘汰的,也可能是没被淘汰的)没被淘汰,即值不为1,就输出 { printf("%d", i+1);//编号为数组下标加一 isNoPrint = 0;//打印了,值为假 return; } } } if (arr!=NULL) { free(arr); arr=NULL; } } int main() { int n = 0; scanf("%d", &n); test42(n); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复