原题链接:明明的随机数
解题思路:
创建int类型的数组,将N个数据存放进去,定义cnt = N;
先给数组排序,排序之后相同的数会在相邻位置(关键),再进行相邻的判断;
若相邻的数相同,把左边的数变为-1(题目中规定数字属于[1,1000]),将-1视作“不输出”的符号,并且cnt--;
最后输出cnt,换行再将数组s中的数字“有选择地”输出(若检测为-1则不输出);
注意事项:
cnt记得减少;
要先定义N才能定义数组s;
去重时要“去掉”左边的数,因为指针(或者说数组中的下标)是向右移动的,如果你从右往左移动就要去掉右边的数,否则会导致去重出错(比如有三个相同的数时)。
不要直接N--,这样会到导致循环终点移动。
qsort函数在头文件<stdlib.h>中,声明为“void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))”;
参考代码:
#include <stdio.h> #include <stdlib.h> //为了调用qsort int upCmp(const void *a, const void *b) //qsort的比较函数,用来将整型升序排列 { return *(int *)a > *(int *)b ? 1 : -1; } int main(void) { int N, cnt; scanf("%d", &N); cnt = N; int s[N]; for (int i = 0; i < N; ++i) //循环N次,输入N个数据 { scanf("%d", &s[i]); } qsort(s, N, sizeof(int), upCmp); //qsort(数组地址,数组元素个数,每个元素大小,排序函数) for (int i = 0; i < N; ++i) //若相邻两个数相同,则将左边的变为-1 { if (s[i] == s[i + 1]) { s[i] = -1; cnt--; //个数减少1个 } } printf("%d\n", cnt); //先输出个数 for (int i = 0; i < N; ++i) { if (s[i] >= 0) //若数据大于1则输出(题目中说了随机数在[1,1000]) printf("%d ", s[i]); } return 0; }
0.0分
9 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复