【JavaScript】配列の最大値と最小値の間の数値の合計を計算する方法
今回は、2つの要素を持つ配列 [a, b] を引数として受け取り、a から b までのすべての整数(両端を含む)の合計を返す関数 sumBetween() を作成します。
期待する動作の例
[4, 7] の場合 → 4+5+6+7 = 22 [10, 6] の場合 → 10+9+8+7+6 = 40
このように、引数の順序が逆になっていても(b の方が小さい場合でも)、同じように正しく合計を求められる点がポイントです。
解決のアプローチ:等差数列の和の公式を活用
1からnまでの整数の合計は、有名な等差数列の和の公式「n × (n + 1) ÷ 2」を使えば瞬時に求められます。この公式を利用することで、for文などのループ処理を使わずに、計算量 O(1) で答えを導き出すことが可能です。
具体的な手順は以下の通りです。
- 大きい方の値までの合計(1から最大値まで)を求める
- そこから、小さい方の値までの合計を引く(これで「最小値+1〜最大値」の合計になる)
- 両端を含めるため、最後に最小値を加算する
コード例
const arr = [10, 60];
const sumUpto = (n) => (n*(n+1))/2;
const sumBetween = (array) => {
if(array.length !== 2){
return -1;
}
const [a, b] = array;
return sumUpto(Math.max(a, b)) - sumUpto(Math.min(a, b)) + Math.min(a,b);
};
console.log(sumBetween(arr));
console.log(sumBetween([4, 9]));
コードの解説
- sumUpto():1からnまでの合計を等差数列の和の公式で計算するヘルパー関数です。
- sumBetween():まず配列の要素数が2以外の場合は -1 を返し、不正な入力を除外しています。
- Math.max() / Math.min():分割代入で取り出した2つの値の大小関係を判定し、引数の順序に依存しない実装を実現しています。
出力結果
コンソールには次のように出力されます。
1785 39
[10, 60] の場合は 1785、[4, 9] の場合は 39 となり、それぞれ範囲内の全整数(両端含む)の合計が正しく計算されていることが確認できます。
-
JavaScriptで配列を降順に並べ替えて隣接要素の差の合計を求める方法
問題 整数の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列を降順に並べ替えたうえで、隣り合う要素同士の差を順番に足し合わせ、その合計値を返すものです。 たとえば、次のような配列が渡された場合を考えてみましょう。 [6, 2, 15] この場合、期待される出力は次のとおりです。 (15 - 6) + (6 - 2) = 13 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 sort()メソッドを使い、配列を降順(大きい順)に並べ替える。 隣接する2つの要素(i番目と i + 1 番目)の差を計算し、合計に加算していく。 配列の要素
-
配列内の素数と非素数の合計の絶対差を求める方法
はじめに本記事では、配列内のすべての素数の合計と、すべての非素数(合成数)の合計の差を求め、その絶対値を計算する方法を解説します。この問題を解くためには、まず各数値が素数かどうかを判定する必要があります。素数判定の基本的なアプローチとしては、「対象の数が 2 からその平方根までのいずれの整数でも割り切れないこと」を確認する方法があります。この方法では、1つの数値の判定に O(√n) の時間計算量が必要です。アルゴリズムdiffPrimeNonPrimeSum(arr)begin sum_p := arr 内のすべての素数の合計 sum_np := arr 内のすべての非素数の合