【Python】2つの数値の2進表現がアナグラムかどうかを判定するプログラム
2つの数値が与えられたとき、その2進表現同士がアナグラム(同じ文字を並べ替えたもの)になっているかどうかを判定します。Pythonでは、collectionsモジュールのCounterクラスと辞書の比較を組み合わせることで、この問題をシンプルかつ効率的に解くことができます。
実行例
入力: a = 8, b = 16 出力: Yes 両方の数値の2進表現は、0と1の個数が同一です。
アルゴリズム
ステップ1 : 2つの数値を受け取ります。 ステップ2 : bin()関数で各数値を2進数の文字列に変換し、接頭辞「0b」に相当する先頭2文字を取り除きます。 ステップ3 : 2つの2進表現は長さが異なる場合があるため、短い方の文字列の先頭に0を追加し、両方を同じ長さに揃えます。 ステップ4 : 両方の文字列をCounterで辞書化して比較します。0と1の出現回数が完全に一致していれば、2つの数値の2進表現はアナグラムであると判定できます。
サンプルコード
# 2つの数値の2進表現がアナグラムかどうかをチェックする関数
from collections import Counter
def anagramoftwonumber(p1, p2):
# 数値を2進数の文字列に変換
# bin()の出力には「0b」という接頭辞が付くため、先頭2文字を除去
bno1 = bin(p1)[2:]
bno2 = bin(p2)[2:]
# 短い方の文字列の先頭に0を追加して長さを揃える
zeros = abs(len(bno1) - len(bno2))
if (len(bno1) > len(bno2)):
bno2 = zeros * '0' + bno2
else:
bno1 = zeros * '0' + bno1
# 2進表現をCounter(辞書)に変換
dict1 = Counter(bno1)
dict2 = Counter(bno2)
# 両方の辞書を比較
if dict1 == dict2:
print(p1, p2, "は互いにアナグラムです")
else:
print(p1, p2, "はアナグラムではありません")
# ドライバープログラム
if __name__ == "__main__":
n1 = int(input("1つ目の数値を入力してください ::>"))
n2 = int(input("2つ目の数値を入力してください ::>"))
anagramoftwonumber(n1, n2)
出力結果
1つ目の数値を入力してください ::>8 2つ目の数値を入力してください ::>16 8 16 は互いにアナグラムです 1つ目の数値を入力してください ::>3 2つ目の数値を入力してください ::>2 3 2 はアナグラムではありません
補足:先頭に0を追加する理由
たとえば、8の2進表現は「1000」、16の2進表現は「10000」です。このまま比較すると0の個数が異なるためアナグラムにはなりませんが、短い方の「1000」の先頭に0を1つ追加して「01000」にすれば、両者とも「0が4個・1が1個」となり、アナグラムと判定されます。この前処理によって、桁数の違いに左右されず、0と1の構成だけで公平に比較できるようになります。
別のアプローチ:sorted()を使う方法
Counterの代わりに、長さを揃えた2進文字列をsorted()でソートして比較する方法もあります。ソート後の文字列が一致すれば、それはアナグラムであることを意味します。
def is_anagram_binary(a, b):
ba, bb = bin(a)[2:], bin(b)[2:]
diff = abs(len(ba) - len(bb))
if len(ba) > len(bb):
bb = '0' * diff + bb
else:
ba = '0' * diff + ba
return sorted(ba) == sorted(bb)
print(is_anagram_binary(8, 16)) # True
print(is_anagram_binary(3, 2)) # False
-
Pythonで素数を判定するプログラムの書き方を徹底解説
はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない
-
Pythonでアームストロング数を判定するプログラムの書き方
この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す