JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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も条件を満たしていることが確認できます。

  1. JavaScriptで指定した数より大きい最小の素数を見つける方法

    問題JavaScriptで、ある数値 n を受け取る関数を作成することを考えます。この関数は、n より大きい数の中で最小となる素数を返す必要があります。アプローチまず、与えられた数が素数かどうかを判定する補助関数 isPrime を用意します。素数判定では、2 からその数の平方根まで順に割り切れるかを確認すれば十分です。平方根以降の因数は必ずペアが存在するため、ここまで調べれば判定できます。これにより計算量を大幅に抑えられます。次に、nextPrime 関数の中で、引数の数値を1ずつ増やしながら isPrime で判定を行い、最初に見つかった素数を返します。コード例以下が実際のコードです。co

  2. 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++