n進法をm進法へ変換するpythonコード

10進法を2進法へ

decimal_number = input('10進数を入力してください ')

d = int(decimal_number)
ans = ''  # ビット列を記録するための変数
while d:
    r = d % 2
    """
      新しく求めたビット r をstr型に変換し、
      記録していたビット列 ans の左に結合する。
    """
    ans = str(r) + ans
    d = d // 2

print(f'{decimal_number}(10)={ans}(2)')

2進法を10進法へ

bit_string = input('2進数を入力してください ')

"""
  例えば
    abcd(2)
  = a×2^3 + b×2^2 + c×2 + d
  = (a×2^2 + b×2 + c)×2 + d
  = {(a×2 + b)×2 + c}×2 + d
  = [{(0×2 + a)×2 + b}×2 + c]×2 + d
  となるから、最後の行の内側の括弧からループで計算する。
"""
ans = 0
for bit in bit_string:
    ans = ans * 2 + int(bit)

print(f'{bit_string}(2)={ans}(10)')

n進法をm進法へ

def main():
    # 値の入力
    print('n進数のaを10進数とm進数に変換します。')
    print('ただし, n, mは2以上10以下または16です。')
    print('n a m を半角で, スペースで区切って入力してください。')
    n, a, m = input().split()

    # 変換結果の出力
    ans_10 = n2d(n, a)
    ans_m = d2n(ans_10, m)  # ans_10 を求めた場合
    # ans_m = n2m(n, a, m)  # ans_10 を求めず直接求める場合
    print(f'{a}({n}) = {ans_10}(10) = {ans_m}({m})')


# 16進数に対応するための辞書の作成
HEXA = '0123456789abcdef'
H_DIC = {HEXA[i]:i for i in range(16)}


# 10進数の decimal_number を n 進数に変換
def d2n(decimal_number, n):
    d, n = int(decimal_number), int(n)

    if (2 <= n <= 10) or n == 16:
        ans = ''
        while d:
            r = d % n
            ans = HEXA[r] + ans
            d = d // n
        return ans
    else:
        return False

# n 進数の n_decimal_number を 10進数に変換
def n2d(n, n_decimal_number):
    # n_decimal_number = str(n_decimal_number) は不要だが念のため
    n, n_decimal_number = int(n), str(n_decimal_number)
    if (2 <= n <= 10) or n == 16:
        ans = 0
        for figure in n_decimal_number:
            ans = ans * n + H_DIC[figure]
        return ans
    else:
        return False

# n 進数の n_decimal_number を m 進数に変換
def n2m(n, n_decimal_number, m):
    # n 進数 n_decimal_number を 10進数 tmp_10 に変換
    tmp_10 = n2d(n, n_decimal_number)
    # 10進数 tmp_10 を m 進数 ans に変換
    ans = d2n(tmp_10, m)
    return ans


if __name__ == '__main__':
    main()

この記事が気に入ったらサポートをしてみませんか?