はじめに
基本情報技術者試験でよく登場する進数変換があります。「プログラマ脳を鍛える数学パズル」という本より自分の復習も合わせて、10進数、2進数、8進数全てで回文数となる最小の数を探すという問題に挑戦をしてみたいと思います。基本情報技術者試験で求められる進数に触れつつ、具体的な問題解決手法をJavaScriptで実装しながら詳しく解説していきます。
進数の基本
- 10進数:日常生活で最も使用される数制で、0から9までの数字を使用します
- 2進数:コンピュータの基本言語として用いられ、0と1のみで数を表現します
- 8進数:主にコンピュータの権限設定などに使用され、0から7までの数字を用います
問題の理解とアプローチ
Q: 10進数、2進数、8進数いずれで表現しても回文数となる数のうち10進数の10以上で最小の値を求めてください。
まず回文数とは、「トマト」のように、どちらから読んでも同じになる特性を持つ言葉や数字のことです。たとえば、10進数では「101」がそれに該当します。今回は10進数、2進数、そして8進数すべてで回文数となる共通の最小数を見つけることが目標です。では具体的なステップを考えてみたのでこの通りに進めて行こうと思います。
ステップ1: 初期値の設定
数の探索を始める最初の値を設定します。10進数で「11」から始めようと考えました。これは、10進数で最初の二桁の回文数であること、2進数の場合1番右の値が0になると「010」のように存在しない数となってしまうことより、問題文は10以上でとなっていますが、「10」を抜いて考えることにします。
ステップ2: 進数変換
選定した数を異なる進数に変換します。
- 10進数:数をそのまま使用。
-
2進数:数を2の基底で表現(
num.toString(2)
を使用)。 -
8進数:数を8の基底で表現(
num.toString(8)
を使用)。
ステップ3: 回文チェック
変換した各進数の数が回文であるかどうかをチェックします。回文チェックには、変換された数を文字列にし、その文字列を反転させて元の文字列と比較します(JavaScriptを使用するのでstr === str.split('').reverse().join('')
を使用)。
ステップ4: 条件の評価
全ての進数で数が回文であるかを確認します。一つでも条件を満たさない場合は、次の数に戻り、再びステップ2から開始します。
ステップ5: 繰り返しと結果の出力
条件を満たす数が見つかるまで、ステップ2から4を繰り返します。条件を満たす最初の数が見つかったら、その数を結果として出力します。
アルゴリズムの説明
数の生成:11からスタートし、各数について検証を行います。
回文チェック関数:与えられた数を10進数、2進数、8進数に変換し、それぞれが回文であるかをチェックします。
全条件の確認:すべての進数で回文であることを確認した最初の数が答えです。
JavaScriptコード
const isPalindrome = str => str === str.split('').reverse().join('');
const findSmallestPalindrome = () => {
let num = 11;
while (true) {
const decimal = num.toString();
const binary = num.toString(2);
const octal = num.toString(8);
if (isPalindrome(decimal) && isPalindrome(binary) && isPalindrome(octal)) {
return num;
}
num++;
}
};
console.log(findSmallestPalindrome());
まとめ
進数変換をプログラムする機会はあまりないですよね。数学パズルを通して私自身も進数変換の考え方を復習できたかなと思います。JavaScriptを今回は使用しましたが、他の言語で考えてみることも問題を解決する方法を学ぶという意味で効果的です。進数変換の考え方は基本情報技術者試験に役立つかと思います。プログラミングスキルも向上させるためにも考え方を学んでいきたいです。
参考文献および推薦サイト
MDN Web Docs(toStringメソッド)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問/著者 増井 敏克
採用拡大中!
アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を大募集しています!
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう!
お問い合わせはこちらから↓
https://official.assisteng.co.jp/contact/