Viết hàm nhận hai số m (tích) và n (tổng), trả về mảng chứa hai số thỏa mãn điều kiện. Nếu không tồn tại, trả về false.
Ví dụ
const perfectNumbers = (sum, prod) => {
for (let i = 0; i < sum / 2; i++) {
if (i * (sum - i) !== prod) {
continue;
}
return [i, sum - i];
}
return false;
};
// Test cases
console.log(perfectNumbers(24, 144)); // false (12+12=24, 12*12=144 nhưng yêu cầu 2 số khác nhau?)
console.log(perfectNumbers(14, 45)); // [5, 9]
console.log(perfectNumbers(21, 98)); // [7, 14]
Kết quả
false [ 5, 9 ] [ 7, 14 ]
Giải thích:
- Duyệt
itừ 0 đếnsum/2(tránh trùng lặp cặp đối xứng). - Kiểm tra
i * (sum - i) === prod. - Trường hợp
sum=24, prod=144: cặp (12,12) thỏa mãn nhưng hàm trả vềfalsedo điều kiệni < sum/2loại trừi=12. Nếu cho phép hai số bằng nhau, hãy đổi thànhi <= sum/2.
Cách tối ưu bằng công thức bậc 2
Giải phương trình: x + y = sum, x * y = prod → x² - sum*x + prod = 0.
const perfectNumbersOptimized = (sum, prod) => {
const discriminant = sum * sum - 4 * prod;
if (discriminant < 0) return false;
const sqrtD = Math.sqrt(discriminant);
if (!Number.isInteger(sqrtD)) return false;
const x1 = (sum + sqrtD) / 2;
const x2 = (sum - sqrtD) / 2;
return Number.isInteger(x1) ? [x1, x2] : false;
};
console.log(perfectNumbersOptimized(14, 45)); // [9, 5]
console.log(perfectNumbersOptimized(21, 98)); // [14, 7]
Cách này O(1) thay vì O(n), phù hợp cho số lớn.