JavaScriptで有理数(分数)の配列を合計し、最も簡単な形式で結果を返す方法
問題
「2つの数値を持つ部分配列」をちょうど2つ含む配列を受け取るJavaScript関数を作成する必要があります。各部分配列は、分数形式で表された有理数です。
この関数の役割は、2つの有理数を加算し、その結果を最も簡単な形式(最簡形)で表す2つの数値からなる新しい配列として返すことです。
解法のアプローチ
分数の加算は、以下の手順で行います。
- 通分する: 2つの分母を掛け合わせて共通の分母を求め、それに合わせて分子も調整します。
- 分子を加算する: 通分後の分子同士を足し合わせます。
- 約分する: 最大公約数(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になる(つまり結果が整数になる)ため、単一の数値として返すようになっています。
-
JavaScriptで10進数のビットを反転して新しい10進数を求める方法
はじめに本記事では、JavaScriptを使って「10進数を2進数に変換し、すべてのビットを反転させ、その結果を再び10進数として返す」関数の実装方法を解説します。問題の定義私たちが作成すべきのは、以下の処理を行うJavaScript関数です。引数として10進数を受け取るその数値を2進数(文字列)に変換する各ビットを反転する(1なら0へ、0なら1へ)反転後の2進数を10進数に戻して返す実装コード以下が実際のコード例です。 { // 数値を2進数の文字列に変換 const binary = num.toString(2); let newBinary = ; // 各ビットを走
-
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