Giới thiệu
Cho tổng n và hiệu k, tìm hai số a, b thỏa mãn: a + b = n và a - b = k.
Giải hệ phương trình
a + b = n a - b = k --------- (+) 2a = n + k → a = (n + k) / 2 b = n - a
Ví dụ
n = 100, k = 30 → a = 65, b = 35 (65+35=100, 65-35=30)
n = 54, k = 12 → a = 33, b = 21 (33+21=54, 33-21=12)
Mã nguồn hoàn chỉnh
#include <bits/stdc++.h>
using namespace std;
void divideTheNumber(int n, int k) {
double a = (n + k) / 2.0;
double b = n - a;
cout << a << " " << b << endl;
}
int main() {
int n = 54, k = 12;
divideTheNumber(n, k);
return 0;
}
Kết quả chạy chương trình
33 21
Điều kiện tồn tại nghiệm nguyên
Để a, b là số nguyên: n + k phải chẵn (tức n và k cùng chẵn hoặc cùng lẻ).
Phiên bản kiểm tra tính hợp lệ
bool divideNumberWithDifference(int n, int k, int &a, int &b) {
if ((n + k) % 2 != 0) {
return false; // Không có nghiệm nguyên
}
a = (n + k) / 2;
b = n - a;
return true;
}
int main() {
int n = 100, k = 30;
int a, b;
if (divideNumberWithDifference(n, k, a, b)) {
cout << "a = " << a << ", b = " << b << endl;
} else {
cout << "Khong co nghiem nguyen" << endl;
}
return 0;
}
Phân tích độ phức tạp
- Thời gian: O(1)
- Không gian: O(1)
Ứng dụng
- Phân bổ tài nguyên với ràng buộc chênh lệch
- Bài toán cân bằng tải (load balancing)
- Chia kế thừa, chia lợi nhuận với điều kiện
Kết luận
Bài toán giải hệ phương trình bậc nhất 2 ẩn cơ bản, ứng dụng rộng rãi trong phân bổ tài nguyên với ràng buộc chênh lệch.