Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tìm giá trị trung vị của 3 số với tối thiểu so sánh C++


Tìm số nằm giữa (median) của 3 số a, b, c chỉ với 2-3 phép so sánh, không cần sắp xếp.

Thuật toán

middle(a, b, c):
  Nếu a > b:
    Nếu b > c: trả về b
    Ngược lại nếu a > c: trả về c
    Ngược lại: trả về a
  Ngược lại (a <= b):
    Nếu a > c: trả về a
    Ngược lại nếu b > c: trả về c
    Ngược lại: trả về b

Ví dụ mã nguồn

#include <iostream>
using namespace std;

int middleOfThree(int a, int b, int c) {
    if (a > b) {
        if (b > c) return b;
        else if (a > c) return c;
        else return a;
    } else {
        if (a > c) return a;
        else if (b > c) return c;
        else return b;
    }
}

// Cách khác: dùng tổng - min - max
int middleSum(int a, int b, int c) {
    return a + b + c - min(a, min(b, c)) - max(a, max(b, c));
}

int main() {
    int a = 10, b = 30, c = 20;
    cout << "Trung vi cua (" << a << ", " << b << ", " << c << ") = "
         << middleOfThree(a, b, c) << '\n';
    return 0;
}

Đầu ra

Trung vi cua (10, 30, 20) = 20

Phân tích

  • Phương pháp so sánh: tối đa 3 phép so sánh, không rủi ro tràn số.
  • Phương pháp tổng: 2 min + 2 max + 2 phép cộng/trừ, có thể tràn số với kiểu lớn.
  • C++17: std::midpoint cho 2 số, nhưng không có cho 3 số.