原题链接:明明的随机数
解题思路:
创建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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> #define N 100 void main() { int n,a[N]={}; scanf("%d",&n); int i,j,k; int term; for(i=0;i<n;i++) scanf("%d",&a[i]); //去重复 for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if( a[i]==a[j] ) { for(k=j;k<n-1;k++) a[k]=a[k+1]; n--; } } } //冒泡法排序 for(i=0;i<n;i++) { for(j=0;j<n-1-i;j++) { if(a[j]>a[j+1]) { term=a[j]; a[j]=a[j+1]; a[j+1]=term; } } } printf("%d\n",n); for(k=0;k<n;k++) printf("%d ",a[k]); printf("\n"); }