解题思路:
创建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分
14 人评分
#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"); }