题目
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0-9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码及注释:
#执行的代码
n=int(input())
for i in range(n):
if n<=10:
s=input()#所有输入默认字符串
if len(s)<=100000:
res_1=int(s,16)#这里的int(s,16)代表把16进制的s转化成10进制
res_2=oct(res_1)#这里的oct代表把一个整数转化为八进制
print(res_2[2:])#这里的[2:]是代表结果从第三位开始输出
#下方是关于进制转换的一些信息,刚上手Python建议读一下
'''本题目可以将输入的16进制数转化为某进制,再将某进制转化为8进制,
于是我在这里拓展一下进制转化的一些方法:
在python中二进制用0b加相应数字来表示,8进制用0o加相应数字来表示,16进制用0x加相应数字来表示。即:
#其他进制转换二进制#
>>> bin(2) #十进制转换二进制#
'0b10'
>>> bin(0o10) #八进制转换二进制#
'0b1000'
>>> bin(0xf) #十六进制转换二进制#
'0b1111'
#其他进制转换为八进制#
>>> oct(0b101)
'0o5'
>>> oct(0xf)
'0o17'
>>> oct(0o123)
'0o123'
#其他进制转换为十六进制#
>>> hex(0o10)
'0x8'
>>> hex(3)
'0x3'
>>> hex(0b111)
'0x7'
'''
'''
#其他进制转换为十进制#
>>> int(0o10)
8
>>> int(0xf)
15
>>> int(0b10)
2
'''
青春,热泪盈眶
评论里面主要有两点问题
一是:输出格式跟题目要求不一致,确实我的输出不严谨,但我的代码输出是可以AC的。
更为严谨的代码由评论区用户七月_Lillian(感谢)给出如下,思路就是将我代码中的所有res_2添加到列表li统一输出:
n=int(input())
li=[]
for i in range(n):
if n<=10:
s=input()#所有输入默认字符串
if len(s)<=100000:
res_1=int(s,16)#这里的int(s,16)代表把16进制的s转化成10进制
res_2=oct(res_1)#这里的oct代表把一个整数转化为八进制
li.append(res_2[2:])#这里的[2:]是代表结果从第三位开始取
for i in li:
print(i,end='\n')
二是代码line9为什么结果从第三位输出,而且为什么 直接16到8不行?res_1=oct(s)这样?
答:1.为什么结果从第三位输出,因为oct()函数转换完会有前缀’0o’代表该数是八进制数,题目要求不能出现前缀; 2.直接16进制转换为8进制不行吗?可以直接转换啊,在这里因为题目规定输入的时候不能带有前缀,所以我觉得要想直接16转8还要加前缀‘0x’,不如通过16转10,10转8来的简单。