## 十六进制转八进制

时间限制: 1Sec 内存限制: 128MB 提交: 489 解决: 362

提交地址：

https://www.dotcpp.com/oj/problem2080.html

**题目描述**

```
给定n个十六进制正整数，输出它们对应的八进制数。
```

**输入**

```
输入的第一行为一个正整数n （1<=n<=10）。
接下来n行，每行一个由0~9、大写字母A~F组成的字符串，表示要转换的十六进制正整数，每个十六进制数长度不超过100000。
```

**输出**

```
输出n行，每行为输入对应的八进制正整数。
```


**【注意】**

```
输入的十六进制数不会有前导0，比如012A。
输出的八进制数也不能有前导0。
```

**样例输入**

```
2
39
123ABC
```

**样例输出**

```
71
4435274
```


```
ord('A')
```




    65



### 方法1


```
n=int(input())
def f(num,n):
    baseStr={}
    for i in range(10,n):
        baseStr[i]=char(i-10+65)
    re=''
    while num!=0:
        temp=num%n
        if temp>9:
            re=baseStr[temp]+re
        else:
            re=str(temp)+re
        num//=n
    return re
for i in range(n):
    num=int(input(),16)
    print(f(num,8))
```

    1
    39
    71


### 方法2


```
n=int(input())
for i in range(n):
    temp=input()
    mid=int(temp,16)
    print('{:o}'.format(mid))
```

### 方法3


```
mapping= \
{
'0':"0000",
'1':"0001",
'2':"0010",
'3':"0011",
'4':"0100",
'5':"0101",
'6':"0110",
'7':"0111",
'8':"1000",
'9':"1001",
'A':"1010",
'B':"1011",
'C':"1100",
'D':"1101",
'E':"1110",
'F':"1111"
}

n=int(input())

for _ in range(n):
    n16=input()
    n2=''
    n8=''
    for i in n16:
        n2+=mapping[i]

    temp=len(n16)*4%3
    if temp==1:
        n2='00'+n2
    elif temp==2:
        n2='0'+n2

    flag=0
    for i in range(0,len(n2),3):
        num=4*int(n2[i])+2*int(n2[i+1])+int(n2[i+2])
        if num!=0:
            flag=1
        if flag:
            print(num,end='')

    print('')
```

    1
    39
    71

进行协议解析时，总是会遇到各种各样的数据转换的问题，从二进制到十进制，从字节串到整数等等
整数之间的进制转换:
10进制转16进制: hex(16)  ==>  0x10
16进制转10进制: int('0x10', 16)  ==>  16
类似的还有oct()， bin()



字符串转整数:
10进制字符串: int('10')  ==>  10
16进制字符串: int('10', 16)  ==>  16
16进制字符串: int('0x10', 16)  ==>  16

