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

JavaScriptで有理数(分数)の配列を合計し、最も簡単な形式で結果を返す方法


問題

「2つの数値を持つ部分配列」をちょうど2つ含む配列を受け取るJavaScript関数を作成する必要があります。各部分配列は、分数形式で表された有理数です。

この関数の役割は、2つの有理数を加算し、その結果を最も簡単な形式(最簡形)で表す2つの数値からなる新しい配列として返すことです。

解法のアプローチ

分数の加算は、以下の手順で行います。

  1. 通分する: 2つの分母を掛け合わせて共通の分母を求め、それに合わせて分子も調整します。
  2. 分子を加算する: 通分後の分子同士を足し合わせます。
  3. 約分する: 最大公約数(GCD)をユークリッドの互除法で求め、分子・分母をそれぞれ割ることで最簡形にします。

コード例

以下が実際のコードです。

const arr = [
    [1, 2],
    [1, 3]
];
const findSum = (arr = []) => {
    const hcf = (a, b) => b ? hcf(b, a % b) : a;
    if(!arr.length){
        return null;
    };
    const [n, d] = arr.reduce(([a, x], [b, y]) => [a*y + b*x, x*y]);
    const g = hcf(n, d);
    return g === d ? n / d : [n / g, d / g];
};
console.log(findSum(arr));

出力

コンソールへの出力結果は次のとおりです。

[5, 6]

コードの解説

1. 最大公約数を求める hcf 関数

hcf はユークリッドの互除法を再帰的に実装した関数です。b が0になるまで剰余演算を繰り返し、最終的に最大公約数を返します。

2. reduce メソッドによる分数の加算

reduce の内部では [a*y + b*x, x*y] という処理を行っています。これは分数の通分と加算を1行で実現するもので、新しい分子は「a×y + b×x」、新しい分母は「x×y」となります。

3. 最簡形への変換

求めた最大公約数 g で分子と分母を割って約分します。また、g === d の場合は分母が1になる(つまり結果が整数になる)ため、単一の数値として返すようになっています。


  1. JavaScriptで10進数のビットを反転して新しい10進数を求める方法

    はじめに本記事では、JavaScriptを使って「10進数を2進数に変換し、すべてのビットを反転させ、その結果を再び10進数として返す」関数の実装方法を解説します。問題の定義私たちが作成すべきのは、以下の処理を行うJavaScript関数です。引数として10進数を受け取るその数値を2進数(文字列)に変換する各ビットを反転する(1なら0へ、0なら1へ)反転後の2進数を10進数に戻して返す実装コード以下が実際のコード例です。 { // 数値を2進数の文字列に変換 const binary = num.toString(2); let newBinary = ; // 各ビットを走

  2. JavaScriptで入力配列の末尾からn個の偶数を抽出して返す方法

    問題数値の配列を第1引数として、数値を第2引数として受け取るJavaScript関数を作成します。この関数の役割は、入力配列の中から末尾側に近い方からn個の偶数を選び出し、それらを新しい配列として返すことです。たとえば、配列 [1, 2, 3, 4, 5, 6, 7, 8, 9] と数値 3 を渡した場合、期待される結果は [4, 6, 8] になります。実装例以下がそのコードです。const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const num = 3; const pickEvens = (arr = [], num = 1) => { c