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::midpointcho 2 số, nhưng không có cho 3 số.