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

【JavaScript】和がn・積がmとなる2つの数値のペアを見つけて返す関数の作り方

はじめに

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

アプローチ

もっともシンプルな方法は線形探索(ブルートフォース)です。0 から n の半分未満までの各整数 i について、「i と (n − i) の積」が m と一致するかどうかを順番に確認していきます。

  • i × (n − i) === m となれば、[i, n − i] を返す
  • ループが終了するまで見つからなければ、false を返す

探索範囲を「n の半分未満」に限定することで、同じ組み合わせを二重にチェックする無駄を省けます。また、この条件により 12 と 12 のような同一数値同士のペアも自動的に除外される点に注目してください。

コード例

const perfectNumbers = (sum, prod) => {
   for(let i = 0; i < (sum / 2); i++){
      if(i * (sum-i) !== prod){
         continue;
      };
      return [i, (sum-i)];
   };
   return false;
};
// 12 と 12 は「2つの異なる数値」ではないため false になる
console.log(perfectNumbers(24, 144));
console.log(perfectNumbers(14, 45));
console.log(perfectNumbers(21, 98));

出力結果

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

false
[ 5, 9 ]
[ 7, 14 ]

コードの解説

  • ループ範囲: i は 0 から sum / 2 未満まで走査します。i が半分を超えると、ペアとなる数 (sum − i) はすでに確認済みのため、それ以上調べる必要はありません。
  • continue 文: 積が一致しない候補はスキップして、次の数へ進みます。
  • 戻り値: 条件を満たすペアが見つかった時点で配列 [i, sum − i] を返却し、最後まで見つからなければ false を返します。

なお、数学的には「x + y = n」「x × y = m」という連立方程式を解き、二次方程式 t² − nt + m = 0 の判別式(n² − 4m)が完全平方数であるかを判定する方法もあります。しかし、小〜中規模の入力であれば、今回のような探索ベースの実装の方が直感的でバグも起こりにくいため、十分実用的と言えます。

まとめ

本記事では、和と積の条件から2つの数値を求める JavaScript 関数を、O(n) の時間計算量で実装する方法を紹介しました。ポイントは「探索範囲を n の半分までに絞る」ことで、効率化と同一数値ペアの除外を同時に実現している点です。

  1. 【C++】合計と最大公約数(GCD)が与えられた2つの数を求める方法

    この記事では、2つの数 a と b の合計(sum)と最大公約数(GCD)が与えられたときに、元の2つの数を復元する方法を解説します。条件を満たす組み合わせが存在しない場合は -1 を返します。 例えば、合計が 6、GCDが 2 とすると、答えは 4 と 2 になります(4 + 2 = 6、gcd(4, 2) = 2 を満たすため)。 考え方(アプローチ) GCDが分かっているということは、2つの数がどちらもGCDの倍数であることが確定します。この性質を利用すると、次の手順で答えを導き出せます。 候補の生成: 片方の数をGCDそのものと仮定すると、もう片方は「合計 − GCD」となります。

  2. 和と積がどちらもNに等しくなる2つの数を求めるC++プログラム

    この記事では、a + b = N かつ a × b = N を同時に満たすような2つの数「a」と「b」を見つけるプログラムの作成方法について解説します。 a + b = N および a × b = N 数学的なアプローチ まず、この問題は代数を使って整理できます。2つの式から「a」を消去すると、「b」と「N」に関する二次方程式が得られます。 b2 − bN + N = 0 この二次方程式には2つの解(根)があり、それぞれが「a」と「b」の値に対応します。解の公式(判別式を利用する方法)を用いて解を求めると、aとbは次のように表されます。 $a= (N-\sqrt{N*N-4N)}/2\\ b=