JavaScript:各桁の合計以上となる最小の素数を求める方法
問題の概要
本記事では、JavaScriptで「数値を受け取り、その各桁の合計を計算し、合計以上となる最小の素数を返す関数」を実装する方法を解説します。
解決アプローチ
この問題は、以下の3つの関数に分けて考えると分かりやすくなります。
- digitSum関数:再帰処理を使って、数値の各桁の合計を求めます。
- isPrime関数:与えられた数値が素数かどうかを判定します。
- nearestPrime関数:桁の合計を起点に、素数が見つかるまで1ずつ増やしながら探索します。
コード例
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
コードの解説
入力値が 56563 の場合を例に見てみましょう。各桁の合計は 5 + 6 + 5 + 6 + 3 = 25 となります。25は5×5のため素数ではありませんが、isPrime関数による判定とwhileループにより、26、27、28と順に確認され、最初の素数である29に到達した時点で処理が終了し、結果として29が返されます。
補足:パフォーマンス改善のヒント
上記のisPrime関数は単純な実装ですが、大きな数を扱う場合は判定範囲を √n まで に絞ることで効率化できます。
const isPrime = n => {
if (n < 2) return false;
for(let x = 2; x * x <= n; x++){
if(n % x === 0) return false;
}
return true;
};このように、処理を小さな関数に分割して組み合わせると、読みやすく保守性の高いコードになります。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
C++で数値の桁の再帰的な合計が素数かどうかを判定する方法
整数変数 number を入力として受け取り、その各桁の合計を計算して、合計値が素数かどうかを判定する問題について解説します。この処理は、桁の合計が一桁になるまで繰り返され、最終的に得られた一桁の数値が素数であるかどうかを確認します。たとえば、入力が 123 の場合、桁の合計は 1+2+3=6 となり、6 は素数ではないため、結果は「素数ではない」となります。 入出力シナリオの例 入力 − number = 12341 出力 − 桁の再帰的な合計は素数(PRIME) 説明 − 1+2+3+4+1 = 111+1 = 22 は素数です。 入力 − number = 1664 出力 − 桁の再帰