JavaScriptで数値の各桁の合計を求め、それ以上の最も近い素数を見つける方法
本記事では、JavaScriptを使って「与えられた数値の各桁を合計し、その合計以上で最も近い素数を返す関数」を実装する方法を解説します。
例えば、56563という数値が与えられた場合、各桁の合計は 5 + 6 + 5 + 6 + 3 = 25 となります。25は素数ではないため、25以上で最も近い素数である 29 を返すことになります。
実装コード
この処理は、以下の3つの関数に分けて実装すると分かりやすくなります。
- digitSum:再帰呼び出しを使って各桁の合計を計算する
- isPrime:ある数値が素数かどうかを判定する
- nearestPrime:合計値から順に素数が見つかるまで探索する
const num = 56563;
// 各桁の合計を再帰的に計算する関数
const digitSum = (num, sum = 0) => {
if(num){
return digitSum(Math.floor(num / 10), sum + (num % 10));
}
return sum;
};
// 素数かどうかを判定する関数
const isPrime = n => {
if (n === 1){
return false;
} else if(n === 2){
return true;
} else {
for(let x = 2; x < n; x++){
if(n % x === 0){
return false;
}
}
return true;
}
};
// 合計値以上で最も近い素数を返す関数
const nearestPrime = num => {
let sum = digitSum(num);
while(!isPrime(sum)){
sum++;
};
return sum;
};
console.log(nearestPrime(num));実行結果
このコードをコンソールで実行すると、以下の出力が得られます。
29
コードの解説
1. digitSum関数(桁の合計)
この関数は再帰的に動作します。num % 10 で末尾の桁を取り出して合計に加え、Math.floor(num / 10) で残りの桁を新しい引数として自身を再度呼び出します。numが0になった時点で合計値を返します。
2. isPrime関数(素数判定)
1は素数ではないためfalseを返し、2は素数なのでtrueを返します。それ以外の数値については、2からn-1までのすべての整数で割り切れるかどうかを確認し、割り切れる数が存在しなければ素数と判断します。
3. nearestPrime関数(最も近い素数の探索)
まずdigitSumで各桁の合計を取得し、その値が素数になるまで1ずつ増やしながらisPrimeで判定を繰り返します。最初に見つかった素数が「合計以上で最も近い素数」となります。
なお、素数判定をより効率化したい場合は、試し割りの範囲を x <= Math.sqrt(n) までに限定することで、大きな数値に対しても高速に処理できるようになります。
-
【初心者向け】JavaScriptのFileとFileReaderを使ってファイルを読み込む方法
JavaScriptにおけるFileとFileReaderとは? JavaScriptでは、<input type=file>要素を使うことで、ユーザーにローカルファイルを選択させることができます。選択されたファイルはFileオブジェクトとして取得でき、ファイル名・サイズ・MIMEタイプなどの基本情報へアクセス可能です。 さらに、FileReaderオブジェクトを利用すれば、選択されたファイルの中身を非同期で読み込み、テキストやデータURLとして扱うことができます。 サンプルコード 以下は、JavaScriptでFileとFileReaderを使用して、ファイルの詳細情報を表示し
-
JavaScriptで配列内のすべてのピーク(局所最大値)とその位置を検出する方法
データ分析や信号処理の現場では、数値の配列の中から「山」にあたる部分、つまり局所最大値(ピーク)とその位置を特定したい場面がよくあります。本記事では、JavaScriptを使って配列内のすべてのピークと、そのインデックス位置を効率的に検出する方法を解説します。 前提となる例 まず、次のようなJavaScriptの配列を用意します。 const arr = [4, 3, 4, 7, 5, 2, 3, 4, 3, 2, 3, 4]; この配列の各要素をY軸の値としてプロットし、隣り合う要素同士をX軸上で等間隔(単位距離)に配置すると、グラフは以下のようになります。 グラフを見ると分かるように、こ