【JavaScript】約数の2乗の合計が平方数(完全な平方)になる整数を範囲内から見つける方法
問題
2つの整数 m と n を要素とする配列で範囲を受け取り、その範囲内から特定の条件を満たす整数をすべて見つける JavaScript 関数を作成します。
条件とは、「ある整数の約数をすべて2乗し、その合計値がそれ自体平方数(完全な平方数)となっている」ことです。
関数は配列の配列(サブ配列のリスト)を返します。各サブ配列には2つの要素が含まれます。
- 1番目の要素:約数の2乗の合計が平方数となる整数
- 2番目の要素:その整数の約数の2乗の合計値
実装例
以下が実際のコードです −
const range = [1, 500];
const listSquared = ([m, n]) => {
const res = [];
for (let i = m; i <= n; ++i) {
let sum = getDivisors(i).reduce((sum, n) => sum + n * n, 0);
let ok = Number.isInteger(Math.sqrt(sum));
if (ok) {
res.push([i, sum]);
}
}
return res;
}
function getDivisors (n) {
const divisors = [];
for (let i = 1; i <= n / 2; ++i) {
if (n % i) {
continue;
}
divisors.push(i);
}
return divisors.concat([n]);
}
console.log(listSquared(range));コードの解説
このコードの処理の流れは以下の通りです。
- getDivisors(n):引数 n の約数をすべて取得する関数です。1 から n/2 まで順に割り切れるかを確認し、最後に n 自身も約数として追加します。
- listSquared([m, n]):範囲内の各整数について getDivisors で約数を取得し、reduce を使って各約数を2乗した値の合計を求めます。
- Number.isInteger(Math.sqrt(sum)):合計値の平方根が整数であれば、その合計は平方数であると判定できます。
- 条件を満たした整数は「[整数, 合計値]」というペアとして結果配列に格納されます。
出力結果
上記のコードを実行すると、コンソールには次のように出力されます。
[ [ 1, 1 ], [ 42, 2500 ], [ 246, 84100 ], [ 287, 84100 ] ]
たとえば 42 の場合、約数は 1, 2, 3, 6, 7, 14, 21, 42 であり、これらを2乗して合計すると 2500 になります。2500 の平方根は 50 なので、42 は条件を満たす整数だということがわかります。
-
JavaScriptでn以下のすべての完全立方数の合計を求める方法
問題 数値 n を引数として受け取り、n 以下に存在するすべての完全立方数(perfect cube)の合計を返すJavaScript関数を作成する必要があります。 完全立方数とは、ある整数を3乗した値として表せる数のことです。たとえば、1(=1³)、8(=2³)、27(=3³)、64(=4³)などが該当します。 アプローチ この問題は非常にシンプルな方法で解くことができます。i を1から順に増やしながら i × i × i(つまり i³)を計算し、その値が n 以下である限り合計に加算していきます。i³ が n を超えた時点でループを終了し、蓄積された合計値を返せば完成です。 この手法では
-
C++で総和が完全平方数となる配列内のペアの個数を求める方法
N個の要素からなる配列が与えられたとき、i ≠ j を満たすペア (Arr[i], Arr[j]) のうち、Arr[i] + Arr[j] の和が完全平方数(perfect square)となるものの個数を求めるのが本記事の目的です。 この問題は、各ペアの和を計算し、その平方根が整数(床関数の値)と一致するかどうかを判定することで解けます。具体的には、sqrt(Arr[i]+Arr[j]) − floor(sqrt(Arr[i]+Arr[j])) == 0 が成り立てば、その和は完全平方数であると分かります。 具体例で確認してみましょう。 例1 入力:Arr[] = { 4, 3, 2, 1,