#include <stdio.h> //标准输入输出库用于调用我们的scanf和printf #include <stdlib.h> //包含了我们的qsort函数用于快速排序 int compare(const void* a, const void* b) { //定义了一个比较函数,在qsort函数进行排序时中比较两个元素的大小,它接受两个void*类型的指针函数 return *(int*)a - *(int*)b; //将其转换为int*类型后,返回两个整数的差值,从而实现从小到大的排序 } int main() { //主程序开始 int n; //定义一个整数n,用来存储我们的N scanf("%d", &n); //将第一行的N读取进n int countArray[501] = {0}; // 定义一个整数数组,将其值初始化为0,用于记录数字出现次数 int resultArray[n]; // 用于存储去重后的数字 int resultCount = 0; // 用于储存不重复的数字的个数(qsort时需要使用) for (int i = 0; i < n; i++) { //遍历数据 int num; //用于存储数据 scanf("%d", &num); //将数据储存到num中 if (countArray[num] == 0) { //如果这个数字还没有出现过 resultArray[resultCount++] = num; //把这个数字存储到resultArray的第resultCount位置 countArray[num]++; //将此数次出现次数加一 } } qsort(resultArray, resultCount, sizeof(int), compare); //对结果进行排序 for (int i = 0; i < resultCount; i++) { //遍历结果 printf("%d\n", resultArray[i]); //输出每一行 } return 0; }
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.给你一个数字n代表数据的个数(n的范围是1<=n<=1000)
2.给你n个数据,每个数据都是一个1到500之间(包括1和500)的整数
3.去除重复的数据(数值相同的只保留一个)
4.对数据进行排序(从小到大)
5.并输出
二、解题思路
1.首先我们读取第一行,也就是数据的行数n
2.然后我们为了节省时间,一边读取一边判断是否重复
3.为了判断是否重复出现我们需要一个判断重复的方法,这里想到比较简单的
方法就是定义一个数组,大小是500,将数组的默认值都设为0,然后开始遍历数据,遍历数据的时候,如果之前是0的话出现了一次的数字就加1,并且放在另外一个数组中(专门用来储存去重之后的数据)如果已经是1了就跳过。
4.对我们储存去重之后的数据的数组进行排序,这里使用快速排序qsort
5.输出结果
这里需要注意的是qsort
使用方法是qsort(需要排序的数组,数组中元素的数量,元素的大小,比较函数)