JavaScriptで最も近い回文数を求める関数を実装する方法
概要
本記事では、数値 n を受け取り、その数値に最も近い回文数(左から読んでも右から読んでも同じ値になる数)を返す関数 nearestPalindrome() の実装方法を解説します。
期待される動作は次の通りです。
- 入力が 264 の場合 → 出力は 262
- 入力が 7834 の場合 → 出力は 7887
アプローチの基本アイデア
考え方はシンプルです。対象の数値を文字列として扱い、桁数を基準に前半と後半に分割します。そのうえで、後半部分を「前半部分の鏡像(逆順に並べたもの)」で置き換えて連結すれば、元の数値に非常に近い回文数を効率よく生成できます。
具体的な手順は以下の通りです。
- 数値を文字列に変換する
- 桁数の半分(奇数桁の場合は切り捨て)の長さで前半部分を取り出す
- 前半部分を反転した文字列を作る
- 奇数桁の場合は中央の桁を含めた前半部分を組み合わせ、偶数桁の場合はそのまま前半を使用する
- 前半と反転した後半を連結し、数値に戻して返す
コード例
const findNearestPalindrome = num => {
const strNum = String(num);
const half = strNum.substring(0, Math.floor(strNum.length / 2));
const reversed = half.split("").reverse().join("");
const first = strNum.length % 2 === 0
? half
: strNum.substring(0, Math.ceil(strNum.length / 2));
return +(first + reversed);
};
console.log(findNearestPalindrome(235));
console.log(findNearestPalindrome(23534));
console.log(findNearestPalindrome(121));
console.log(findNearestPalindrome(1221));
console.log(findNearestPalindrome(45));
出力結果
コンソールには次のように表示されます。
232
23532
121
1221
44
コードのポイント解説
- String() で数値を文字列化することで、桁ごとの操作が容易になります。
- split("").reverse().join("") の組み合わせにより、配列を経由して文字列を簡単に反転できます。
- 奇数桁の数値では中央の桁が前半側に含まれるため、Math.ceil を使って切り上げた長さで文字列を切り出しています。
- 先頭の +(単項プラス演算子)により、連結結果の文字列を数値型へ変換して返しています。
注意点
この手法は「前半をそのままミラーする」というシンプルな戦略のため、繰り上がりが関わるケースでは必ずしも真に最も近い回文を返すとは限りません。たとえば入力が 199 の場合、この方法では 191 が得られますが、実際には差がより小さい 202 の方が近い回文です。厳密な判定が必要な場合は、「前半 - 1」「前半」「前半 + 1」それぞれから生成した回文候補を比較し、元の数値との差が最小のものを選ぶようロジックを拡張するとよいでしょう。
-
JavaScriptのNumber()関数とは?使い方とサンプルコードを解説
JavaScriptのNumber()関数は、引数として渡された値やオブジェクトを、それに対応する数値へ変換するための関数です。真偽値や文字列型の数字、さらにはDateオブジェクトなども数値に変換できるため、データ型の変換処理において非常に便利な組み込み関数の一つです。例えば、Number(true)は「1」、Number(false)は「0」を返します。また、数字のみで構成された文字列「149」を渡せば数値の149に変換され、new Date()で生成した日付オブジェクトを渡すと、1970年1月1日からの経過ミリ秒数が返されます。以下に、Number()関数の動作を確認できるサンプルコードを
-
JavaScriptで数字パターンを表示する方法【初心者向けサンプルコード】
本記事では、テキスト入力欄とボタンを備えたJavaScript・HTMLプログラムの作成方法を解説します。ユーザーが入力欄に任意の数値(例:5)を入力してボタンをクリックすると、画面に以下のような数字パターンが表示される仕組みです。(n = 5 の場合の出力例)01 01 02 01 02 03 01 02 03 04 01 02 03 04 05仕組みのポイントこのパターンは二重ループ(ネストしたforループ)を使うことで実現できます。外側のループが「行」を制御し、内側のループがその行に表示する「数字の個数」を制御します。i 行目には 1 から i までの数字が順番に出力されるため、行が進む