JavaScriptで特定の範囲のアームストロング数を見つける方法
アームストロング数とは?
アームストロング数(Armstrong Number)とは、各桁の数字を桁数乗した値の総和が、元の数と一致する特別な数のことです。
数学的に表現すると、次の式が成り立ちます。
xy…z = xn + yn + … + zn
ここで n はその数の桁数を表します。
具体例:153の場合
153は3桁の数なので、各桁の数字を3乗して合計すると元の数に戻ります。
1³ + 5³ + 3³ = 1 + 125 + 27 = 153
この性質を満たしているため、153はアームストロング数だといえます。
実装する内容
今回は、2つの数値(下限と上限)を受け取り、その範囲に含まれるすべてのアームストロング数を配列として返すJavaScript関数を作成します。範囲の両端の値も、アームストロング数であれば結果に含まれます。
サンプルコード
const isArmstrong = number => {
let num = number;
const len = String(num).split("").length; // 桁数を取得
let res = 0;
while (num) {
const last = num % 10; // 一の位の数字を取り出す
res += Math.pow(last, len); // 桁数乗して合計に加算
num = Math.floor(num / 10); // 処理済みの桁を切り捨てる
}
return res === number; // 元の数と一致するか判定
};
const armstrongBetween = (lower, upper) => {
const res = [];
for (let i = lower; i <= upper; i++) {
if (isArmstrong(i)) {
res.push(i);
}
}
return res;
};
console.log(armstrongBetween(1, 400));
コードの解説
プログラムは、判定用と検索用の2つの関数で構成されています。
isArmstrong関数:アームストロング数の判定
String(num).split("").lengthで数値を文字列に変換し、桁数を求めます。whileループの中では、剰余演算子%によって一の位の数字を取り出し、Math.pow()で桁数乗して合計に加算します。Math.floor(num / 10)で処理済みの桁を切り捨て、次の桁へと進みます。- 最後に合計値が元の数と一致するかどうかを比較し、真偽値として返します。
armstrongBetween関数:範囲内の検索
指定された範囲の数値を1つずつ isArmstrong 関数に渡して判定し、条件を満たす数だけを配列に格納して返します。
実行結果
コンソールには次のように出力されます。
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371 ]
1桁の数(1〜9)はどれも「1乗した値が自分自身と等しい」ため、すべてアームストロング数に該当します。さらに3桁の153・370・371も条件を満たしていることが確認できます。
-
JavaScriptで指定した数より大きい最小の素数を見つける方法
問題JavaScriptで、ある数値 n を受け取る関数を作成することを考えます。この関数は、n より大きい数の中で最小となる素数を返す必要があります。アプローチまず、与えられた数が素数かどうかを判定する補助関数 isPrime を用意します。素数判定では、2 からその数の平方根まで順に割り切れるかを確認すれば十分です。平方根以降の因数は必ずペアが存在するため、ここまで調べれば判定できます。これにより計算量を大幅に抑えられます。次に、nextPrime 関数の中で、引数の数値を1ずつ増やしながら isPrime で判定を行い、最初に見つかった素数を返します。コード例以下が実際のコードです。co
-
JavaScriptで指定した範囲内にある「ある数で割り切れる数」の個数を求める方法
問題2つの整数からなる範囲(配列)を第1引数に、1つの数値を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在する「入力された数値で割り切れる数」をすべて見つけ、その合計個数を返します。サンプルコード以下がその実装例です。const range = [6, 57]; const num = 3; const findDivisibleCount = (num = 1, [l, h]) => { let count = 0; for(let i = l; i <= h; i++