描述
输入无符号整数序列(不多于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;
}