标签:main space values bsp style get 返回 一半 stream
一. 问题
1. 定义:中值使得一个序列中一半元素在它之前,一半元素在它之后。
2. 问题:求出一个序列的中值。
二. 思路
我们有一个序列,需要知道序列元素的个数。当有奇数个元素时,中值自然就是最中间的数字;当有偶数个元素时,需要将最中间的两个元素相加,求得的平均值就是序列的中值。
序列的元素可以是任何类型的(比如整数,浮点数等),我们需要先将这个序列排序,再进行上述运算。如果不进行排序,那么这个中值没有意义。
举个栗子:
1.有一个序列 1, 2, 3, 4, 5,包含5个元素,它的中值是3。
2.有一个序列1, 2, 3, 4, 5, 6, 包含6个元素,它的中值是中间元素3和4相加的平均值。
我们要特别注意下标的计算,因为下标从0开始。
三. 代码实现
1 double get_mid_value(const vector<int> &values) { 2 int total_val = values.size(); 3 double mid_value = 0.0; 4 if (total_val % 2 == 0) { 5 mid_value = static_cast<double>((values[total_val / 2] + values[total_val / 2 - 1])) / 2; 6 } else { 7 mid_value = values[total_val / 2]; 8 } 9 10 return mid_value; 11 }
主函数测试如下:
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 int main() { 7 vector<int> ages; 8 int current_age = 0; 9 cout << "Enter age : "; 10 while (cin >> current_age) { 11 ages.push_back(current_age); 12 cout << "Enter age : "; 13 } 14 15 sort(ages.begin(), ages.end()); 16 double mid_age = get_mid_value(ages); 17 cout << "Middle age = " << mid_age << endl; 18 19 return 0; 20 }
代码中有几处需要说明:
1. 函数接受一个常量引用,因为它不修改序列内容。
2. 假设序列元素为整数类型,但是中值仍然有可能是浮点数,所以应该返回一个浮点类型。
3. 注意函数中对于下标的计算。
4. 代码中为了简洁没有使用模板,没有进行错误处理,但是大家应该知道这个函数应该能够处理不同种类的数据。
标签:main space values bsp style get 返回 一半 stream
原文地址:https://www.cnblogs.com/Hello-Nolan/p/13378460.html