zoukankan      html  css  js  c++  java
  • 25.计算中值

    一. 问题

    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. 代码中为了简洁没有使用模板,没有进行错误处理,但是大家应该知道这个函数应该能够处理不同种类的数据。

  • 相关阅读:
    TreeSet——实现Comparable接口并重写CompareTo()方法
    HashMap的四种遍历方式
    HashMap—— values() remove方法 containsKey()方法 containsValue()方法
    HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)
    CSS——font使用方法
    css——选择器
    Eclipse怎么改变工程保存路径
    jsp其实是一个java类
    HTML——b i del a p img h1 h2 h3 h4 h5 h6 hr ol ul 标签的使用方法详解
    ACM算法练习-——ZJU1164-Software CRC
  • 原文地址:https://www.cnblogs.com/Hello-Nolan/p/13378460.html
Copyright © 2011-2022 走看看