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

JavaScriptで「2乗の和」と「和の2乗」の差を求める方法

数値 n を唯一の引数として受け取るJavaScript関数を作成することを考えます。この関数は、以下の3つの処理を行います。

  • 最初のn個の自然数の2乗の和(1² + 2² + … + n²)を計算する
  • 最初のn個の自然数の和の2乗((1 + 2 + … + n)²)を計算する
  • 両者の差の絶対値を返す

例として、n = 5 の場合を確認してみましょう。

2乗の和 = 1 + 4 + 9 + 16 + 25 = 55
和の2乗 = (1 + 2 + 3 + 4 + 5)² = 15 × 15 = 225

したがって、出力結果は 225 − 55 = 170 となります。

実装コード

この問題を解くJavaScriptのコードは次のとおりです。

const squareDifference = (num = 1) => {
    let x = 0;
    let y = 0;
    let i = 0;
    let j = 0;

    // 2乗の和を計算する関数
    (function sumOfSquares() {
        while (i <= num) {
            x += Math.pow(i, 2);
            i++;
        }
        return x;
    }());

    // 和の2乗を計算する関数
    (function squareOfSums() {
        while (j <= num) {
            y += j;
            j++;
        }
        y = Math.pow(y, 2);
        return y;
    }());

    // 差の絶対値を返す
    return Math.abs(y - x);
};

console.log(squareDifference(1));
console.log(squareDifference(5));
console.log(squareDifference(10));
console.log(squareDifference(15));

コードの解説

  • sumOfSquares: 即時実行関数式(IIFE)として定義されており、変数 i を 0 から num まで増やしながら、各数値の2乗を変数 x に加算していきます。
  • squareOfSums: 同じくIIFEとして、変数 j を使って 0 から num までの総和を変数 y に加算し、最後にその合計を2乗します。
  • 最後に Math.abs() によって、2つの値の差の絶対値を戻り値として返します。

なお、while文をfor文に置き換えたり、2つの計算を1つのループにまとめたりすることで、さらに簡潔に記述することも可能です。

出力結果

上記のコードを実行すると、コンソールには次のように出力されます。

0
170
2640
13160

各入力値に対する計算の内訳は以下のとおりです。

  • n = 1 の場合: 2乗の和 = 1、和の2乗 = 1 → 差は 0
  • n = 5 の場合: 2乗の和 = 55、和の2乗 = 225 → 差は 170
  • n = 10 の場合: 2乗の和 = 385、和の2乗 = 3025 → 差は 2640
  • n = 15 の場合: 2乗の和 = 1240、和の2乗 = 14400 → 差は 13160

応用:数学の公式を使った高速化

この問題は、Project Euler の有名な問題(Problem 6)としても知られています。実は、次の閉形式の公式を利用すれば、ループ処理なしで O(1) の定数時間で計算できます。

  • 2乗の和: n(n + 1)(2n + 1) ÷ 6
  • 和の2乗: (n(n + 1) ÷ 2)²
const squareDifferenceFast = (num = 1) => {
    const sumOfSquares = (num * (num + 1) * (2 * num + 1)) / 6;
    const squareOfSums = Math.pow((num * (num + 1)) / 2, 2);
    return squareOfSums - sumOfSquares;
};

console.log(squareDifferenceFast(100)); // 25164150

大きな数値を扱う場合やパフォーマンスが重要な場面では、こちらの公式ベースの実装の方が圧倒的に効率的です。用途に応じて、シンプルなループ方式と使い分けるとよいでしょう。

  1. JavaScriptにおける関数とメソッドの違いとは?わかりやすく解説

    JavaScriptにおいて、関数とメソッドは本質的には同じものです。両者の違いは、メソッドがオブジェクトのプロパティとして定義された関数であるという点にあります。つまり、独立して定義されたものを「関数」、オブジェクトに紐づけられたものを「メソッド」と呼びます。 JavaScriptの関数の基本形 まず、一般的な関数の定義方法を見てみましょう。 function functionname(param1, param2){ // 処理内容 } JavaScriptのメソッドの例 メソッドは、オブジェクトに関連付けられた関数です。次の例では、employeeオブジェクトの中にdetails

  2. C#におけるメソッドと関数の違い

    C#におけるメソッドと関数の違いC#において、「メソッド」と「関数」は本質的に同じものを指します。ただし、C#では一般的に「メソッド」という用語が使われるのが特徴です。これは、C#がオブジェクト指向言語であり、すべてのコードがクラス内に記述されるためです。つまり、メソッドとは「指定されたクラスに属し、そのクラスを通じて動作する関数」のことを意味します。メソッドとは、ひとつのタスクを実行するためにまとめられたステートメント(文)のグループです。すべてのC#プログラムには、Mainという名前のメソッドを持つクラスが少なくとも1つ含まれており、プログラムの実行は必ずこのMainメソッドから開始されま