JavaScriptでmとnの大小関係に関係なく、nからmまでの偶数の合計を求める方法
本記事では、2つの数値 m と n を引数として受け取り、その間に存在するすべての偶数(両端を含む)の合計を返す関数をJavaScriptで作成します。ポイントは、n < m の場合でも n > m の場合でも、引数の順序にかかわらず正しい結果を返す必要があるという点です。
具体例
たとえば、m = 10、n = -4 が与えられた場合を考えてみましょう。
m = 10、n = -4 の場合
このときの出力は、10 + 8 + 6 + 4 + 2 + 0 + (-2) + (-4) = 24 となります。負の数が含まれていても、また引数の順序が逆でも、正しく計算できることが求められます。
アプローチ
この問題は、以下の手順で効率的に解くことができます。
まず、0から n までのすべての偶数の合計と、0から m までのすべての偶数の合計をそれぞれ求めます。次に、m と n のどちらが大きい方かを判定し、大きい方の合計から小さい方の合計を差し引きます。これにより、m と n の間に存在する偶数の合計が得られます。最後に、両端の値が差し引きの過程で除外されてしまうため、小さい方の値を加え直せば完成です。
使う数式
0から N までのすべての偶数(0 + 2 + 4 + … + N)の合計は、次の式で一発に求められます。
$$\frac{N\times(N+2)}{4}$$
これは、公差2の等差数列の和の公式を変形したものです。ループで足し合わせることなく、O(1) の定数時間で計算できるため、非常に高速です。
コード例
それでは、上記の考え方を実際のコードにしてみましょう。
const sumEven = n => (n*(n+2))/4;
const evenSumBetween = (a, b) => {
return a > b ? sumEven(a) - sumEven(b) + b : sumEven(b) - sumEven(a) + a;
};
console.log(evenSumBetween(-4, 10));
console.log(evenSumBetween(4, 16));
console.log(evenSumBetween(0, 10));
console.log(evenSumBetween(8, 8));
console.log(evenSumBetween(-4, 4));コードのポイント
sumEven関数は、0から n までの偶数の合計を数式ベースで即座に計算します。evenSumBetween関数では、三項演算子を使って a と b の大小を比較し、大きい方の合計から小さい方の合計を引いたうえで、小さい方の値を加え直しています。これにより、引数の順序(n<m でも n>m でも)に左右されない実装になっています。
実行結果
コンソールには次のように出力されます。
24 70 30 8 0
それぞれ、-4〜10 の偶数の合計(24)、4〜16 の偶数の合計(70)、0〜10 の偶数の合計(30)、8のみの場合(8)、-4〜4 の偶数の合計(0)を表しており、負の数や同一の値を含むケースでも正しく動作していることが確認できます。
-
JavaScriptでバラバラの数字名から数字を復元する方法
問題 次のように、数字の英語名の文字が混ぜ込まれた文字列があるとします。 const str = 'TOWNE'; この文字列をよく観察すると、文字を組み合わせることで「TWO(2)」と「ONE(1)」という2つの数字名が見つけられます。 したがって、この場合に期待される出力は「21」です。 今回の課題は、このような文字列を引数として受け取り、その中に隠れている数字を検出して返すJavaScript関数を記述することです。 解き方のアプローチ この問題は、以下の手順で解決できます。 0〜9の各数字名(ZERO、ONE、TWOなど)について、考えられるすべての並べ替え(順列
-
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