問題の説明
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