JavaScriptで指定範囲内のアームストロング数をすべて求める方法
アームストロング数とは
アームストロング数(Armstrong Number)とは、n桁の正の整数において、各桁の数字をn乗した値の総和が元の数と等しくなる数のことです。以下のように定義されます。
abcd... = a^n + b^n + c^n + d^n + ...
例えば、153は3桁の数であり、1³ + 5³ + 3³ = 1 + 125 + 27 = 153 となるため、アームストロング数に該当します。
実装の概要
ここでは、範囲の開始値と終了値の2つの数値を含む配列を受け取り、その範囲内に存在するすべてのアームストロング数を配列として返すJavaScript関数を作成します。範囲の端の数がアームストロング数である場合も、結果に含まれる点に注意してください。
実装の流れはシンプルです。まず、単一の数値がアームストロング数かどうかを判定する関数を独立して用意し、次に指定された範囲を反復処理しながら条件に合致する数を結果配列に追加していきます。
サンプルコード
以下が実際のコードです。
const range = [11, 1111];
const isArmstrong = (num) => {
const numberOfDigits = ('' + num).length;
let sum = 0;
let temp = num;
while (temp > 0) {
let remainder = temp % 10;
sum += remainder ** numberOfDigits;
temp = parseInt(temp / 10);
}
return sum === num;
};
const findAllArmstrong = ([start, end]) => {
const res = [];
for(let i = start; i <= end; i++){
if(isArmstrong(i)){
res.push(i);
};
};
return res;
};
console.log(findAllArmstrong(range));コードの解説
isArmstrong関数
この関数では、まず数値を文字列化することで桁数(numberOfDigits)を取得します。続いて、whileループの中で「10で割った余り」から下位の桁を1つずつ取り出し、その桁の数字を桁数分だけべき乗した値を合計(sum)に加算していきます。最後に、合計値が元の数と一致するかどうかを真偽値として返します。
findAllArmstrong関数
こちらの関数では、分割代入(Destructuring)を使って引数の配列からstart(開始値)とend(終了値)を取り出しています。そして、forループで範囲内の各整数を順番にisArmstrong関数へ渡して判定し、アームストロング数であれば結果配列resにpushします。最後に完成した配列を返却します。
実行結果
上記のコードを実行すると、コンソールには次の出力が表示されます。
[ 153, 370, 371, 407 ]
このように、11以上1111以下の範囲に含まれるアームストロング数は153、370、371、407の4つであることが確認できます。
-
JavaScriptの範囲オーバーフロー・範囲アンダーフロー(rangeOverflow/rangeUnderflow)プロパティの使い方
rangeOverflow・rangeUnderflowプロパティとはJavaScriptでは、フォーム要素の validity プロパティ(ValidityStateオブジェクト)を利用することで、ユーザーが入力した値が条件を満たしているかどうかを簡単に検証できます。この中には、数値の入力範囲をチェックするための「rangeOverflow」と「rangeUnderflow」という2つのプロパティが用意されています。Range Underflow(範囲アンダーフロー)入力要素の値が、min属性で指定された最小値よりも小さい場合、validity.rangeUnderflow は true を
-
Pythonで指定した範囲内の素数を求める方法
指定された数値の範囲内にある素数を見つけたい場合、まず範囲(下限・上限)を入力し、その間の数値を順番に反復処理していきます。素数かどうかの判定には「%」(剰余)演算子を使用します。サンプルコード以下に具体的な実装例を示します。lower_range = 670 upper_range = 699 print(下限と上限の範囲は:) print(lower_range, upper_range) print(lower_range, から, upper_range, までの素数は:) for num in range(lower_range, upper_range + 1): if nu