Python |ベース変換の問題

問題の説明

n個の16進数の正の整数が与えられた場合、対応する8進数を出力します。

1 入力フォーマット

入力の最初の行は正の整数n(1 <= n <= 10)です。

次のn行では、各行に0〜9と大文字のA〜Fで構成される文字列が含まれ、変換される正の16進数の整数を示し、各16進数の長さは100000を超えません。

2 出力フォーマット

n行を出力します。各行は、正の8進整数に対応します。

【注意】

入力された16進数には、012Aなどの先行0はありません。

出力オクタル数にも先行0を含めることはできません。

3 サンプル入力

2

39

123 ABC

4 サンプル出力

71

4435274

解決

直接変換が難しい場合は、「中間値」を見つけることができます。つまり、octal-decimal-octal

サンプルコード

def jz(x):

 s=0

 a={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}

 x=str(x)[::-1]for i inrange(len(str(x))):#10進数に変換

  if x[i]in a:

   s+=a[x[i]]*16**i

  else:

   s+=int(x[i])*16**i

 h=''while s>=1:#バイナリを変換する

  h+=str(s%2)

  s=s//2

 s=h#バイナリ

 iflen(s)%3==0:

  pass

 else:

  s+='0'*(3-len(s)%3)

 p=''for i inrange(0,len(s),3):#オクタルを変換します(グループとして右から左に3つ)

  k=s[i:i+3][::-1]

  t=int(k[0])*2**2+int(k[1])*2**1+int(k[2])*2**0

  p+=str(t)returnint(p[::-1])

n=int(input())for i inrange(n):

 g=input()print(jz(g))

結論

10進法での数字の配置はこんな感じです...

Rベースの数字の配置は次のようになります...... R ^ 4 R ^ 3R ^ 2 R ^ 1 R ^ 0 R ^ -1 R ^ -2 R ^ -3 ..... ..

法則:隣接する桁の違いは、システムの1乗です。

例えば:

10進数123 = 1×100 + 2×10 + 3×1

10進数で9876 = 9×1000 + 8×100 + 7×10 + 6×1

基本変換のルールは非常に単純ですが、多くの人はそれを知らず、実際の操作は非常に間違いやすいです。

END

Recommended Posts

Python |ベース変換の問題