Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで数値の2進表現が回文かどうかを判定する方法

ある整数 n が与えられたとき、その2進表現が回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを判定する方法を解説します。

例えば、入力が n = 9 の場合を考えてみましょう。9の2進表現は「1001」であり、これは回文であるため、出力は True になります。

解法のアプローチ

この問題は、数値の2進表現をビット単位で反転し、元の数値と比較することで解けます。具体的な手順は以下の通りです。

  • ans を 0 で初期化する
  • num が 0 より大きい間、次の処理を繰り返す
    • ans を1ビット左シフトする(ans × 2 と同等)
    • num が奇数(最下位ビットが1)なら、ans の最下位ビットをXOR演算で1にする
    • num を1ビット右シフトする(num ÷ 2 と同等)
  • ループ終了後の ans は、元の数の2進表現を逆順に並べ替えた値になるため、これを元の数と比較して等しければ回文と判定できる

実装例

それでは、実際のコードを見てみましょう。

def reverse_binary(num) :
    ans = 0
    while (num > 0) :
        ans = ans << 1
        if num & 1 == 1 :
            ans = ans ^ 1
        num = num >> 1
    return ans

def solve(n) :
    rev = reverse_binary(n)
    return n == rev

n = 9
print(solve(n))

入力

9

出力

True

コードの仕組み

reverse_binary 関数は、引数として渡された数値の2進表現をビット単位で反転した結果を返します。solve 関数では、この反転結果が元の数値と一致するかどうかを確認しており、一致すれば2進表現が回文であると判断できます。

別のアプローチ:文字列を使った簡潔な方法

Pythonでは、組み込み関数 bin() とスライスを組み合わせることで、より簡潔に記述することもできます。

def solve(n) :
    b = bin(n)[2:]          # '0b' プレフィックスを除去した2進文字列
    return b == b[::-1]     # 反転した文字列と比較

n = 9
print(solve(n))

bin(9)'0b1001' を返すため、[2:] で先頭の '0b' を取り除きます。あとはスライス [::-1] で文字列を反転し、元の文字列と一致するかを比較するだけです。こちらの方法は可読性が高く、実務でも扱いやすいのが魅力です。

  1. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない

  2. Pythonでアームストロング数を判定するプログラムの書き方

    この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す