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

描述

输入无符号整数序列(不多于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<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int index = -1;
		bool isnum = false;
		char s[1000] = { '\0' };
		int a[500] = { 0 };
		cin >> s;//输入一组数据
		for (int j = 0; j < 1000; j++) {
			if (s[j] == '\0')
				break;
			else {
				if (s[j] != ',') {
					if (isnum) {
						a[index] = a[index] * 10 + (int)s[j]-48;
						//48是‘0’的ascii码值
					}
					else {
						index++;
						isnum = true;
						a[index] = (int)s[j]-48;
					}
				}
				else
					isnum = false;
			}
		}
		//至此我们已经把整个a数组都录入了进来
		//此时index的值就是现在数组a的最大下标
		int b[150] = { 0 };
		for (int ii = 0; ii <= index; ii++) {
			b[a[ii]]++;
		}
		int max[150] = { 0 };
		int count = 0;
		for (int iii = 0; iii < 150; iii++) {
			if (b[iii] > b[max[0]]) {
				if (count){
					for (int i = 1; i <= count; i++) {
						max[i] = 0;
					}
				}
				count = 0;
				max[0] = iii;
			}
			else if (b[iii] == b[max[0]]) {
				count++;
				max[count] = iii;
			}
		}
		//max的值就是a数组的众数
		//找到出现次数最多且相同的数组中哪个数最先出现
		if (count) {
			for (int k = 0; k <= count; k++) {
				if (find(a, a + index + 1, max[k]) < find(a, a + index + 1, max[0]))
					max[0] = max[k];
			}
		}
		sort(a, a + index + 1);
		if (a[0] == a[index])
			cout << "mode=NO";
		else
			cout << "mode=" << max[0];
		if (index % 2) {
			cout << ",median=(" << a[index / 2] << "+" << a[index / 2+1] << ")/2" << endl;
		}//说明a数组的元素个数为偶数
		else {
			cout << ",median=" << a[index / 2] << endl;
		}
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grausam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值