整数序列中的众数和中位数

题目 整数序列中的众数和中位数  
来源 元培-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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值