一. 問題
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. 代碼中為了簡潔沒有使用模板,沒有進行錯誤處理,但是大家應該知道這個函數應該能夠處理不同種類的數據。