问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
1 输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
2 输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
3 样例输入
2
39
123ABC
4 样例输出
71
4435274
解决方案
在直接进制转换较难时,可以找个“中间值”。即十八进制——十进制——八进制
示例代码
def jz(x): s=0 a={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15} x=str(x)[::-1] for i in range(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:#转化2进制 h+=str(s%2) s=s//2 s=h#2进制 if len(s)%3==0: pass else: s+='0'*(3-len(s)%3) p='' for i in range(0,len(s),3):#转化8进制(从右到左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) return int(p[::-1]) n=int(input()) for i in range(n): g=input() print(jz(g)) |
结语
十进制中的数位排列是这样的…… 万 千 百 十 个 十分 百分 千分……
R进制中的数位排列是这样的……R^4 R^3R^2 R^1 R^0 R^-1 R^-2 R^-3……
规律:相邻的数位间相差该进制的一次方。
例如:
十进制的123=1×100+2×10+3×1
十进制的9876=9×1000+8×100+7×10+6×1
进制转换规律很简单,但很多人不知道,且实际操作很容易出错。