筛排处理 AC
Tags: root@172.22.237.2
Time Limit: 1 s Memory Limit: 128 MB
Submission:3922 AC:1168 Score:66.38
SubmitCodes
Description
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N<=100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作
Input
每组输入数据的第一行含有一个正整数N,表示后面行中有N个随机整数。若N=0,表示处理结束。
Output
对应每组输入数据,输出一组数据,该数据由单独一行开头,内含一个N,表示后面有N个排好序的整数,整数之间空一格。每组输出数据之间空一行。
Samples
input Copy
12 2 4 6 17 20 40 43 45 60 64 85 98 17 35 75 40 61 56 21 85 61 50 83 52 22 44 68 51 80 38 0
output Copy
12 2 4 6 17 20 40 43 45 60 64 85 98 16 21 22 35 38 40 44 50 51 52 56 61 68 75 80 83 85
下面列出了两种方法。
法一是较为简便的一种。
法二使用方法较为普遍。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int main()
{
int n;
int tot;
while (~scanf("%d", &n)) {
if (n == 0) break;
int a[110] = { 0 };
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
qsort(a, n, sizeof(a[0]), cmp);
tot = n;
//-------------------------------------法一:不修改原数组中的元素,碰见相同的元素即跳过,不同的元素再赋值给另一个数组;
/*int b[110];
int num = 0;
for (int i = 0; i < n; i++)
if (a[i] != a[i + 1]) b[num++] = a[i];
printf("%d\n", num);
for (int i = 0; i < num; i++) printf("%d ", b[i]);
printf("\n\n");*/
//--------------------------------法二:对a中的元素进行修改,碰见相同的数即开始修改;
//此法可放在排序前,亦可放在排序后面。
for (int i = 0; i < tot; i++)
for (int j = i + 1; j < tot; j++)
if (a[j] == a[i]) {
for (int u = j; u < tot; u++)
a[u] = a[u + 1];
tot--;
j--;//这个j--非常重要,若没有j--,当出现重复元素更改之后,j的值保留并加一,返回循环时无法确定是否原数组会出现三个以上元素连续且相等的情况。
}
printf("%d\n", tot);
for (int i = 0; i < tot; i++) printf("%d ", a[i]);
printf("\n\n");
}
return 0;
}