【JavaScript】数値が回文数かどうかを文字列変換なしで判定する方法
はじめに
本記事では、与えられた数値が回文数(パリンドローム)であるかどうかを判定する関数を JavaScript で実装します。
ここでの重要な制約は「数値を文字列やその他のデータ型に変換せずに」判定することです。つまり、純粋な数値演算だけで処理を完結させる必要があります。
回文数とは?
回文数とは、前から読んでも後ろから読んでも同じ数字になる数値のことです。例えば、以下のような数値が該当します。
121 343 12321
実装の方針
文字列変換を使わない代わりに、次の手順で先頭と末尾の桁を順番に比較していきます。
- まず、数値の桁数に対応した係数(factor)を求めます。これにより先頭の桁を取り出せるようになります。
Math.floor(num / factor)で先頭の桁を、num % 10で末尾の桁を取得します。- 両者が一致しなければ
falseを返します。 - 一致した場合は両端の桁を削除し、factor を 100 分の 1 に縮小して処理を続けます。
- すべての桁の比較が完了すれば
trueを返します。
サンプルコード
const isPalindrome = (num) => {
// 先頭の桁を取り出すための適切な係数を求める
let factor = 1;
while (num / factor >= 10){
factor *= 10;
}
while (num) {
let first = Math.floor(num / factor);
let last = num % 10;
// 先頭と末尾の桁が一致しなければ false を返す
if (first != last){
return false;
}
// 数値から先頭と末尾の桁を除去する
num = Math.floor((num % factor) / 10);
// 桁が2つ減るため、factor を 1/100 に縮小する
factor = factor / 100;
}
return true;
};
console.log(isPalindrome(123241));
console.log(isPalindrome(12321));
console.log(isPalindrome(145232541));
console.log(isPalindrome(1231));
コードの動作イメージ
例えば 12321 の場合、最初のループで factor は 10000 になります。そのため、以下のように処理が進みます。
- 先頭の桁:
Math.floor(12321 / 10000)→ 1 - 末尾の桁:
12321 % 10→ 1 - 両者は一致しているため、
(12321 % 10000) / 10→ 232 となり、factor は 100 に更新されます。 - 同じ処理を繰り返し、すべての桁が一致すれば回文数と判定されます。
実行結果
コンソールには次のように出力されます。
false true true false
このように、文字列への変換を一切行うことなく、数値演算だけで回文数の判定を実現できます。
まとめ
本記事では、数値を文字列に変換せずに回文数かどうかを判定する方法を紹介しました。先頭と末尾の桁を順に取り出して比較していくシンプルなアルゴリズムで、処理は桁数の半分程度のループで完了します。「文字列操作は禁止」といった制約のあるコーディング面接などでも役立つテクニックなので、ぜひ覚えておきましょう。
-
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 までの数字が順番に出力されるため、行が進む