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

JavaScriptで分数の合計を求める方法【小数に変換せず計算】

次のような、配列の中に配列が入ったネスト構造のデータがあるとします。

const arr = [[12, 56], [3, 45], [23, 2], [2, 6], [2, 8]];

外側の配列には任意の数の要素を含めることができますが、それぞれのサブ配列は必ず2つの数値を持つ必要があります。

各サブ配列の2つの数値は、1つの分数を表します。たとえば、最初のサブ配列 [12, 56] は「12/56」、2番目のサブ配列 [3, 45] は「3/45」という分数に対応します。

要件

今回作成するのは、このような配列を受け取り、すべてのサブ配列が表す分数の合計を計算するJavaScript関数です。条件は以下の2点です。

  • 合計は小数に変換せず、分数形式(分子・分母)のまま計算すること
  • 結果は、最終的な分数を表す「2つの要素を持つ配列」として返すこと

実装コード

以下がその実装例です。

const arr = [[12, 56], [3, 45], [23, 2], [2, 6], [2, 8]];

// 最大公約数(GCD)を求める関数
const gcd = (a, b) => {
   let num = 2, res = 1;
   while(num <= Math.min(a, b)){
      if(a % num === 0 && b % num === 0){
         res = num;
      };
      num++;
   };
   return res;
}

// 2つの分数を加算する関数
const sumFrac = (a, b) => {
   const aDenom = a[1], aNumer = a[0];
   const bDenom = b[1], bNumer = b[0];
   let resDenom = aDenom * bDenom;
   let resNumer = (aDenom*bNumer) + (bDenom*aNumer);
   const greatestDivisor = gcd(resDenom, resNumer);
   return [resNumer/greatestDivisor, resDenom/greatestDivisor];
};

// 配列内のすべての分数を合計する関数
const sumArrayOfFractions = arr => {
   return arr.reduce((acc, val) => sumFrac(acc, val));
};

console.log(sumArrayOfFractions(arr));

出力結果

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

[ 1731, 140 ]

これは、すべての分数の合計が 1731/140(約12.36)であることを意味します。

コードの解説

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

分数を約分するために、まず最大公約数(GCD)を求めます。ここではシンプルなループを使い、2から始めて両方の数を割り切れる最大の数を探しています。

2. 分数を加算する sumFrac 関数

2つの分数 a/b と c/d の加算は、通分によって次の式で行います。

a/b + c/d = (a×d + c×b) / (b×d)

計算後、gcd関数で分子と分母を約分し、最も簡単な形の分数を配列として返します。

3. 全体を合計する reduce

最後に Array.prototype.reduce() を使うことで、配列内のすべての分数に対して順番にsumFracを適用し、1つの分数にまとめています。

  1. JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説

    JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>

  2. 【初心者向け】JavaScriptでボタンクリック時に数値を加算するSum関数の作り方

    はじめに 本記事では、ボタンをクリックするたびに指定した値を加算していき、結果を画面に表示するシンプルなJavaScriptの「Sum関数」の実装方法を解説します。onclickイベントとparseInt()を組み合わせることで、わずか数行のコードで動的な加算処理を実現できます。 ボタンの準備 まず、以下のようなHTMLボタンを用意します。 <button type=button onclick=addTheValue(10)>Sum</button> このボタンがクリックされると、引数として10を渡して関数 addTheValue(10) が呼び出されます。つま