C语言:给定n个数字,找出前m大的数字。 输入 多组输入,每组输入格式如下。 第一行包含两个整数n m。(n<=100000, m>0) 第二行包含n个正整数。 输出 输出前m大的数字,若m>n输出ERROR。每组输出占一行。
时间: 2024-03-18 10:40:40 浏览: 22
这是一道经典的算法题,可以使用堆排序来解决。
C语言代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100000
int cmp(const void *a, const void *b) {
return *(int *)b - *(int *)a;
}
int main() {
int n, m, a[MAX_N];
while (scanf("%d%d", &n, &m) == 2) {
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
if (m > n) {
printf("ERROR\n");
continue;
}
qsort(a, n, sizeof(int), cmp);
for (int i = 0; i < m; ++i) {
printf("%d\n", a[i]);
}
}
return 0;
}
```
时间复杂度为O(nlogn),可以通过本题。
相关问题
C语言实现以下功能:给定n个数字,找出前m大的数字。 输入 多组输入,每组输入格式如下。 第一行包含两个整数n m。(n<=100000, m>0) 第二行包含n个正整数。 输出 输出前m大的数字,若m>n输出ERROR。每组输出占一行。
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
int cmp(const void* a, const void* b) {
return *(int*)b - *(int*)a;
}
int main() {
int n, m, i;
int* nums;
while (scanf("%d %d", &n, &m) == 2) {
nums = (int*)malloc(sizeof(int) * n);
for (i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
qsort(nums, n, sizeof(int), cmp);
if (m > n) {
printf("ERROR\n");
} else {
for (i = 0; i < m; i++) {
printf("%d\n", nums[i]);
}
}
free(nums);
}
return 0;
}
```
解释:
这个程序会不断读入多组输入,每组输入包括n和m两个整数,以及n个正整数。首先将这n个数字存储到一个数组中,然后使用标准库函数`qsort()`对这个数组进行从大到小排序。如果m大于n,则输出"ERROR";否则输出数组中前m个数字。
用C语言实现以下功能:给定n个数字,找出前m大的数字。 输入 多组输入,每组输入格式如下。 第一行包含两个整数n m。(n<=100000, m>0) 第二行包含n个正整数。 输出 输出前m大的数字,若m>n输出ERROR。每组输出占一行。
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
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];
for (int i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
if (m > n) {
printf("ERROR\n");
continue;
}
qsort(num, n, sizeof(int), cmp);
for (int i = 0; i < m; i++) {
printf("%d\n", num[i]);
}
}
return 0;
}
```
代码思路解析:
首先,我们使用了 `scanf` 函数来读取输入。由于有多组输入,我们使用了 `while` 循环来重复读取输入。
然后,我们使用一个数组 `num` 来存储输入的 `n` 个数字。接着,我们判断如果 `m` 大于 `n`,就输出 `ERROR` 并跳过当前输入,否则就对数组进行快速排序,将数组中的数字按从大到小的顺序排列。
最后,我们输出前 `m` 大的数字即可。