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

【JavaScript】指定した範囲内の素数を抽出して合計を求める方法

課題の概要

2つの数値 ab を引数として受け取り、その間に存在するすべての素数の合計を返すJavaScript関数を作成します。ab 自身が素数である場合も、計算対象に含めます。

実装コード

まずは、素数の抽出と合計計算を行う実際のコードを見てみましょう。

const num1 = 45;
const num2 = 345;

// 数値が素数かどうかを判定する関数
const isPrime = n => {
  if (n === 1){
    return false;
  } else if (n === 2){
    return true;
  } else {
    for (let x = 2; x < n; x++){
      if (n % x === 0){
        return false;
      }
    }
    return true;
  }
};

// 指定範囲内の素数を配列として取得する関数
const primeBetween = (a, b) => {
  const res = [];
  while (a <= b){
    if (isPrime(a)){
      res.push(a);
    }
    a++;
  }
  return res;
};

// 範囲内の素数を取得
const primes = primeBetween(num1, num2);
console.log(primes);

// reduce()を使って素数の合計を算出
const sum = primes.reduce((acc, val) => acc + val, 0);
console.log(`合計: ${sum}`);

コードの解説

① 素数判定関数 isPrime()

isPrime() は、渡された数値が素数かどうかを判定します。1は素数ではないため false を返し、2は最小の素数であるため true を返します。それ以外の数値については、2から順に割っていき、一度でも割り切れる数が現れた時点で素数ではないと判断します。

② 素数の収集 primeBetween()

primeBetween() は、開始値 a から終了値 b まで順に数値をチェックし、isPrime() が true を返す数値だけを配列 res に追加していきます。ループ終了後、範囲内のすべての素数を格納した配列が返されます。

③ 合計値の算出

Array.prototype.reduce() メソッドを使えば、取得した素数の配列をシンプルに合計できます。初期値 0 を設定し、各要素を順番に加算していく仕組みです。

出力結果

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

[
    47,  53,  59,  61,  67,  71,  73,  79,  83,
    89,  97, 101, 103, 107, 109, 113, 127, 131,
   137, 139, 149, 151, 157, 163, 167, 173, 179,
   181, 191, 193, 197, 199, 211, 223, 227, 229,
   233, 239, 241, 251, 257, 263, 269, 271, 277,
   281, 283, 293, 307, 311, 313, 317, 331, 337
]
合計: 9910

パフォーマンスを向上させるポイント

扱う範囲が大きくなると、上記の素数判定では処理時間が増えていきます。実は素数判定では、約数のチェックを n の平方根(√n)まで 行えば十分です。以下のように条件を「x * x <= n」に変更するだけで、大幅な高速化が期待できます。

const isPrimeOptimized = n => {
  if (n < 2) return false;
  for (let x = 2; x * x <= n; x++){
    if (n % x === 0) return false;
  }
  return true;
};

この最適化版の isPrime 関数を primeBetween() に組み込むだけで、大きな範囲でも快適な動作を実現できます。

  1. JavaScriptで範囲内のすべての数値の合計を求める方法

    問題範囲を指定する配列を受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲に含まれるすべての自然数(両端の数値も含む)の合計を計算し、その結果を返すものとします。解決策:ループを使った実装以下のコードでは、forループを使って下限値から上限値まで順番に足し合わせていく、シンプルな実装例を示します。const range = [4, 67];const findSum = ([l, h]) => {    let sum = 0;    for(let i = l; i <

  2. JavaScriptで指定した範囲内の自然数の配列を生成して返す方法

    はじめにこの記事では、[a, b](a ≤ b)という形式の2つの数値からなる配列を受け取り、a から b までのすべての自然数(両端の値を含む)を要素とする配列を返す JavaScript 関数の実装方法を解説します。問題作成する関数は、範囲を指定する配列 [a, b](ただし a ≤ b)を引数として受け取り、その範囲に含まれるすべての自然数を配列として返す必要があります。境界値である a と b 自身も結果に含める点がポイントです。サンプルコード以下が基本的な実装例です。const range = [6, 45]; const naturalBetweenRange = ([lower,