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

Tìm hai số biết tổng và tích trong JavaScript

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 i từ 0 đến sum/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ề false do điều kiện i < sum/2 loại trừ i=12. Nếu cho phép hai số bằng nhau, hãy đổi thành i <= 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.