问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
方法1
思路:1.由于同时输入好几个数,所以准备两个列表,一个存放16进制的数,另一个存放8进制的数。
2.对存放16进制的列表一一遍历,先把数字转化为10进制,然后再转换为8进制,然后存放到另一个列表中。
3.对存放8进制的列表一一遍历,将其输出。
while True:
try:
n = int(input())
q = 1
B = []
while q<=n:
num = input()
B.append(num)
q = q+1
for z in B:
sum = 0
j = 1
for i in z:
if i <= str(9):
num = i
elif i == 'A':
num = 10
elif i == 'B':
num = 11
elif i == 'C':
num = 12
elif i == 'D':
num = 13
elif i == 'E':
num = 14
elif i == 'F':
num = 15
sum = sum + int(num)*(16**(len(z)-j))
j = j+1
A = []
if sum== 0:
print(0)
while sum != 0:
k = sum%8
A.append(k)
sum = sum // 8
A.reverse()
for l in A:
print(l,end='')
print()
except:
break
方法2
思路:大体方法和上面一直,只不过16进制转换10进制的时候用的是ord()函数
while True:
try:
n=int(input())
a = [[] for i in range(n)]
b = [[] for i in range(n)]
for i in range(n):
a[i]=input()
for i in range(n):
s,m=0,0
for j in range(len(a[i])):
if a[i][j].isdigit():
s=s+(ord(a[i][j])-ord('0'))*pow(16,len(a[i])-j-1)
elif a[i][j].isalpha():
s=s+(ord(a[i][j])-ord('A')+10)*pow(16,len(a[i])-j-1)
while s:
m=s%8
b[i].append(m)
s=int(s/8)
for i in range(n):
for j in range(len(b[i])):
print(b[i][len(b[i])-j-1],end="")
print()
except:
break