1.问题描述
通常把在n个排序好的数中,位于最中间的数就叫做“中位数”,在这里再规定详细一点,如果n是奇数,那么最中间的一个数就是中位数,但如果n是偶数,那么最中间的数有两个,我们把这两个数的平均数叫做中位数。下面的任务是判断中位数大还是所有数的平均数大。
【Input】
输入只有一行,若干个整数,前后两个整数之间用空格隔开,输入以0结束。每个整数的范围是 -1000 ~ 1000(含-1000和1000),输入的整数个数不超过2000。
【Ouput】
输出只有一行,如果中位数比平均数大,那么输出Yes,否则输出No。
【Sample Input】
200 100 -100 300 400 -200 0
【Sample Output】
Yes
2. 问题分析
这个题涉及排序,求和运算。需要注意的是,求出来的平均数和“中位数”不一定是整数,需要使用浮点类型。
3. 参考程序
#include <stdio.h>
#include <stdlib.h> //快速排序必须使用这个标签
int a[2005];
int cmp(const void *a, const void *b) { //快速排序
return *(int *)a - *(int *)b;
}
int main() {
int len = 0; //用于记录输入整数个数
int sum = 0; //用于收集所有整数的和,方便后序计算平均数
while(scanf("%d", &a[len]) != EOF && a[len] != 0) { //当输入0时结束循环
sum += a[len];
len++;
}
qsort(a, len, sizeof(int ), cmp); //快排调用函数
double middle = (len%2) ? a[len/2] : ((a[len/2] + a[len/2 - 1]) / 2.0); //中位数
double avg = sum*1.0/len; //平均数
printf("%s\n", middle > avg ? "Yes" : "No"); //按照题意,中位数大于平均数输出“Yes”, 否则输出“No”
return 0; //程序结束
}
4. 总结
上面的程序还是运用了挺多的三目运算符,如果小伙伴觉得不适应的话可以观看学习文章:三目运算符
都看到这里了,方便点个关注吗,求求了(✿◡‿◡)