Pythonで数値が8進数表記の回文かどうかを判定する方法
ある数値が与えられたとき、それが8進数として表現されているのか、それとも10進数なのかを判別し、8進数表記において回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを判定する問題を考えてみましょう。
具体的には、次のようなルールで処理を行います。
- 数値のいずれかの桁に「8」や「9」が含まれている場合 → その数値は10進数と判断し、8進数に変換してから回文判定を行う
- すべての桁が「0〜7」の範囲に収まっている場合 → その数値は8進数としてそのまま扱い、各桁を取り出して回文判定を行う
たとえば、入力が num = 178 の場合を考えてみます。「8」という数字は8進数では使用できないため、この数値は10進数形式だと判断されます。178を8進数に変換すると 262 となり、これは回文なので出力は True になります。
解き方の手順
- 基数の決定: num のすべての桁が8未満であれば、その数値は8進数として扱うため基数を10に設定し(桁をそのまま取り出す)、8以上の桁が含まれていれば10進数と判断して基数を8に設定します。
- 各桁の抽出: 空のリスト oct_list を用意し、num が0になるまで次の処理を繰り返します。
- oct_list の末尾に「num を base で割った余り」を追加する
- num を「num を base で割った商」で更新する
- 回文判定: 先頭を指すポインタ k と末尾を指すポインタ j を用意し、k ≤ j の間、oct_list[j] と oct_list[k] を比較します。一致しないペアが見つかった時点で False を返し、最後まで一致すれば True を返します。
実装例
以下にPythonでの実装例を示します。
def is_all_under_8(num):
while num:
if (num % 10) >= 8:
return False
else:
num = int(num / 10)
return True
def solve(num):
# 8以上の桁を含む場合は10進数とみなし、8進数へ変換するため基数8を使用
base = 8 if not is_all_under_8(num) else 10
oct_list = []
while num != 0:
oct_list.append(num % base)
num = int(num / base)
# 回文判定(両端から中央に向かって比較)
j = len(oct_list) - 1
k = 0
while k <= j:
if oct_list[j] != oct_list[k]:
return False
j -= 1
k += 1
return True
num = 178
print(solve(num))
入力
178
出力
True
処理の流れを確認
num = 178 の場合、桁に「8」が含まれているため is_all_under_8() は False を返し、基数は8に設定されます。その後の除算処理では、次のように各桁が抽出されていきます。
- 178 ÷ 8 = 22 余り 2
- 22 ÷ 8 = 2 余り 6
- 2 ÷ 8 = 0 余り 2
結果として oct_list = [2, 6, 2] となり、両端の要素が一致しているため回文と判定され、True が出力されます。
計算量について
桁の抽出と回文判定は、いずれも数値の桁数に比例した処理となるため、全体の時間計算量は O(log n) です。また、桁を格納するリストが必要となるため、必要な追加メモリも O(log n) となります(n は入力された数値)。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
数値の2進表現が回文かどうかを判定するPythonプログラム
ここでは、Pythonの組み込み関数を活用して、数値の2進表現が回文(パリンドローム)になっているかどうかを判定します。まず bin() 関数で数値を2進数形式の文字列に変換し、次にその文字列を反転させて元の文字列と比較します。両者が一致すれば回文、一致しなければ回文ではないと判断できます。 実行例 Input: 5 Output: palindrome 解説 数値 5 の2進表現は 101 です。 この文字列を反転しても 101 のままなので、元の文字列と一致します。 したがって、5 は回文であると判定されます。 アルゴリズム Palindromenumber(n) /* n は判定対