合計が指定の数値になる3つの連続する自然数を確認する方法 - JavaScript
今回は、数値 n を引数として受け取り、合計がちょうど n に等しくなる3つの連続する自然数(小数や浮動小数点数ではなく整数)が存在するかどうかを判定する JavaScript 関数を作成します。
該当する数値の組み合わせが存在する場合はその3つの数値を配列で返し、存在しない場合は false を返す仕様とします。
考え方:数学的なアプローチ
3つの連続する自然数を x、x + 1、x + 2 と表すと、その合計は次のように書けます。
x + (x + 1) + (x + 2) = 3x + 3
この式から、以下の条件が導き出せます。
- 合計は必ず3の倍数になるため、
n % 3 !== 0の場合には解が存在しません。 - 最も小さい組み合わせは
1 + 2 + 3 = 6であるため、n < 6の場合にも解は存在しません。 - 上記の条件を満たす場合、
x = (n - 3) / 3として3つの数値を求められます。
実装コード例
const sum = 54;
const threeConsecutiveSum = sum => {
// 合計が6未満、または3の倍数でない場合は解なし
if (sum < 6 || sum % 3 !== 0) {
return false;
}
// 3つの数値は x + (x + 1) + (x + 2) = 3x + 3 の形になる
const residue = sum - 3;
const num = residue / 3;
return [num, num + 1, num + 2];
};
console.log(threeConsecutiveSum(sum));
実行結果
コンソールには以下の出力が表示されます。
[ 17, 18, 19 ]
17 + 18 + 19 = 54 となり、確かに合計が 54 と一致していることがわかります。
まとめ
この問題は「3つの連続する数の合計は常に3の倍数になる」という性質を利用することで、ループを使わず O(1) の計算量で効率的に解くことができます。条件判定と簡単な算術演算だけで答えが求まるため、可読性も高く実用的なアプローチです。
-
C++で数値が3つの連続する整数の和として表現できるか判定する方法
本記事では、ある数値が「3つの連続する整数の和」として表現できるかどうかを判定する方法を解説します。例えば、27という数値は 8 + 9 + 10 のように、3つの連続する整数の合計として書き表すことができます。 問題を解く2つのアプローチ この問題には、大きく分けて2つの解き方があります。 1. 単純なアプローチ(ナイーブ法) 最初の方法は最も直感的なものです。i + (i + 1) + (i + 2) を計算し、それが対象の数値と一致するかどうかを順番に確認していきます。ただし、この方法では候補を一つずつ調べる必要があるため、数値が大きい場合には非効率になります。 2. 効率的なアプローチ
-
C++で数値が連続する整数の和として表現できるか判定する方法
この記事では、ある数値が2つ以上の連続する整数の和として表現できるかどうかを判定する方法を解説します。例えば、12は「3 + 4 + 5」のように表現できます。 この問題には、非常にシンプルで効率的な解法があります。鍵となるのは次の性質です。「2の累乗である数は、連続する整数の和として表現できない」というものです。この性質を理解するために、以下の2つの事実を押さえておきましょう。 任意の2つの連続する整数の和は必ず奇数になります。これは、一方が奇数でもう一方が偶数であるためです。 2n = 2(n-1) + 2(n-1) という関係が常に成り立ちます。 これらの事実から、2の累乗は1以外の