用C语言实现以下功能:给定n个数字,找出前m大的数字。 输入 多组输入,每组输入格式如下。 第一行包含两个整数n m。(n<=100000, m>0) 第二行包含n个正整数。 输出 输出前m大的数字,若m>n输出ERROR。每组输出占一行。。并写出注释
时间: 2024-02-12 10:04:06 浏览: 80
以下是C语言实现的代码,并附有注释:
```c
#include <stdio.h>
#include <stdlib.h> // 快速排序需要用到stdlib.h头文件
// 快速排序的比较函数,按从大到小排序
// 注意,这个函数的参数类型必须是const void *
int cmp(const void *a, const void *b) {
return *(int *)b - *(int *)a;
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) == 2) { // 不断读入输入,直到读到文件结尾
int num[n]; // 定义一个大小为n的数组
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]); // 读入n个数字
}
if (m > n) { // 如果m大于n,输出ERROR并跳过当前输入
printf("ERROR\n");
continue;
}
qsort(num, n, sizeof(int), cmp); // 对数组进行快速排序
for (int i = 0; i < m; i++) { // 输出前m大的数字
printf("%d\n", num[i]);
}
}
return 0; // 程序结束
}
```
代码思路解析:
首先,我们使用了 `scanf` 函数来读取输入。由于有多组输入,我们使用了 `while` 循环来重复读取输入。
然后,我们使用一个数组 `num` 来存储输入的 `n` 个数字。接着,我们判断如果 `m` 大于 `n`,就输出 `ERROR` 并跳过当前输入,否则就对数组进行快速排序,将数组中的数字按从大到小的顺序排列。
最后,我们输出前 `m` 大的数字即可。需要注意的是,我们在快速排序时使用了 `qsort` 函数,该函数的第一个参数是要排序的数组,第二个参数是数组的元素个数,第三个参数是每个元素的大小,第四个参数是比较函数。在本题中,我们定义了一个比较函数 `cmp`,该函数接收两个指向数组元素的指针,并返回它们的差值。由于函数的参数类型必须是 `const void *`,所以我们需要进行类型转换。
阅读全文