| 来源 | 元培-From WHF | 描述 | 输入无符号整数序列(不多于500个整数,每个整数不大于150),计算序列的众数和中位数。 众数是指出现次数最多的那个数;如果有多个数出现的次数都达到最多,则取最先出现的数为众数;如果所有的数都相等,则众数由大写 NO 表示。 中位数是指按大小排序后正好居中的那个数(如果序列有奇数个整数,大小位于序列中最中间的数为中位数,如果序列中有偶数个整数,则取中间两个数的平均值,以除式表示平均值) 例如,有如下6个数: 6,2,4,2,3,3 2和3出现的次数最多,均为2次,但序列中2先出现,因此,众数选择2;在中间位置的两个数均为3,因此,中位数是(3+3)/2; 如果序列是 1,2,4,2,5,3,6 则众数是2,中位数是3。 如果是序列 2,2,2,2,2,2,2 则众数为 NO,中位数为2 | 关于输入 | 第1行表示后面的整数序列个数; 之后若干行,每行对应一个无符号整数序列,整数之间由逗号间隔。 | 关于输出 | 输出每行对应的众数和中位数(众数在前),其间逗号间隔。如果没有众数,则以NO表示。 如果中位数是两个数的平均数,则输出形式为:(x1+x2)/2,其中,x1 <= x2 | 例子输入 | 3
6,2,4,2,3,3
1,2,4,2,5,3,6
2,2,2,2,2,2,2
| 例子输出 | mode=2,median=(3+3)/2
mode=2,median=3
mode=NO,median=2
| 提示 | 每个序列中整数的个数请自己想办法计算。 | |
#include <stdio.h>
#include <stdlib.h>
int int_compare(const void *pa, const void *pb)
{
int a = *(int *) pa;
int b = *(int *) pb;
return a - b;
}
int main()
{
int t;
int a[500];
scanf("%d", &t);
while (t--)
{
int n = 0; /* 序列中整数个数 */
int box[151] = { 0 }; /* 不同的整数出现的次数 */
int k = 0, x = 0; /* 众数出现的次数及其下标 */
int j;
/* 输入 */
scanf("%d", &a[0]);
while (scanf(",%d", &a[++n]))
continue;
/* 众数 */
for (j = 0; j < n; ++j)
{
++box[a[j]];
}
for (j = 0; j < n; ++j)
{
if (box[a[j]] > k)
{
k = box[a[j]];
x = j;
}
}
if (k == n)
{
printf("mode=NO" ",");
}
else
{
printf("mode=%d" ",", a[x]);
}
/* 中位数 */
qsort(a, n, sizeof(int), int_compare);
if (n % 2 == 0)
{
printf("median=(%d+%d)/2" "\n", a[n / 2 - 1], a[n / 2]);
}
else
{
printf("median=%d" "\n", a[n / 2]);
}
}
return 0;
} |