JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】和と積から2つの数のペアを見つける関数の作り方

問題の概要

2つの数 m と n を引数として受け取り、和が n かつ 積が m となる2つの数を返す JavaScript 関数を作成します。条件を満たす組み合わせが存在しない場合は false を返す仕様とします。

解法の考え方

もっとも直感的なアプローチは線形探索(全探索)です。0 から和の半分までの整数 i を順に調べ、「i × (n − i)」が積 m と一致するかどうかを確認します。

一致する i が見つかった時点で [i, n − i] を配列として返し、ループが完了しても見つからなければ false を返します。計算量は O(n) とシンプルですが、小〜中規模の入力であれば十分実用的です。

コード例

const findNumberPair = (sum, prod) => {
   for (let i = 0; i <= sum / 2; i++) {
      if (i * (sum - i) !== prod) {
         continue;
      }
      return [i, sum - i];
   }
   return false;
};

console.log(findNumberPair(24, 144));
console.log(findNumberPair(14, 45));
console.log(findNumberPair(21, 98));

実行結果

コンソールには次のように出力されます。

[ 12, 12 ]
[ 5, 9 ]
[ 7, 14 ]

注意点:等しい数のペアを見逃さない

ループ条件を i < sum / 2 としてしまうと、2つの数が等しいケース(例:和 24・積 144 のときの 12 と 12)を検出できず、誤って false を返してしまいます。条件を i <= sum / 2 に変更することで、このようなケースも正しく処理できます。

発展:二次方程式を使った高速化

x + y = n、xy = m を連立して解くと、x は二次方程式 x² − nx + m = 0 の解であることが分かります。解の公式より x = (n ± √(n² − 4m)) / 2 なので、O(1) で答えを求められます。

const findNumberPairByFormula = (sum, prod) => {
   const d = sum * sum - 4 * prod; // 判別式
   if (d < 0) return false; // 実数解なし
   const root = Math.sqrt(d);
   const x = (sum + root) / 2;
   const y = (sum - root) / 2;
   return Number.isInteger(x) && Number.isInteger(y) ? [y, x] : false;
};

console.log(findNumberPairByFormula(14, 45)); // [ 5, 9 ]

まとめ

シンプルな全探索でも十分に動作しますが、等しい数のペアへの対応を忘れないことが重要です。また、大きな数値を扱う場合は二次方程式の解の公式を利用することで、効率的に求められます。


  1. JavaScriptで数列の和を計算する方法

    問題次のような級数の和を考えてみましょう。$$seq(n,\:p)=\displaystyle\sum\limits_{k=0}^{n}(-1)^{k}\times\:p\:\times 4^{n-k}\:\times\frac{2n-k}{k}$$この問題では、数値 n と p を引数として受け取り、seq(n, p) の計算結果を返すJavaScript関数を作成することが求められます。この級数は以下の要素で構成されています。(-1)k: kが偶数なら正、奇数なら負となる交互符号p: 固定の係数4n-k: 4の冪乗(2n-k)/k: kに応じて変化する倍率解決策forループを使って k =

  2. JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法

    問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に