python实现进制转换是十分容易的,可通过hex(),otc(),bin()等函数将十进制转换为十六进制、八进制和二进制等,为了改变垃圾的code能力,这里还是手写了一下
第一道题目为十六进制转八进制,提示说先将十六进制转换为某种进制,在转换为八进制:
傻傻的我竟然认为是先转十进制再转八进制,理论可行,但速度太慢,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51# hexoadecimal 十六进制的
# octal 八进制的
# decimal 十进制的
# quotient 商、系数、份额
# remainder 余数
def hexToDec(hex):
# 判断是否为负数
isNegative = 0
if hex[0] == '-':
hex = hex[1:]
isNegative = 1
# 十进制数初始化
dec = 0
hex = list(hex)
l = len(hex)
t = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
for i in range(l):
dec = dec + t.index(hex[i]) * (16 ** (l-1-i))
if isNegative:
return dec*(-1)
else:
return dec
def decToOct(dec):
# 十进制除8取余倒序排列即可
res = []
while 1:
if dec // 8 <= 0:
res.append(str(dec))
break
else:
res.append(dec % 8)
dec = dec // 8
res.reverse()
oct = ''
for x in res:
oct = oct + str(x)
return oct
if __name__ == "__main__":
n = int(input())
while n>=1:
n = n-1
hex = input()
dec = hexToDec(hex)
# print('dec:', dec)
oct = decToOct(dec)
print(oct)
运行超时我竟然以为是python太慢的原因(真的太蠢了),用c++实现了一下(写的时候才发现c++忘得差不多了),代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using namespace std;
string intToStr(int i){
stringstream ss;
ss<<i;
return ss.str();
}
int hexToDec(string hex){
int isNegative = 0;
if(hex[0]=='-'){
hex = hex.substr(1,hex.length()-1);
isNegative = 1;
}
int l = hex.length();
int dec = 0;
string t = "0123456789ABCDEF";
for(int i = 0 ; i < l ; i++){
dec += t.find(hex[i]) * (pow(16,(l-1-i)));
}
if (isNegative){
return dec*(-1);
}
else{
return dec;
}
}
string decToOtc(int dec){
int isNegative = 0;
if(dec < 0){
dec *=-1;
isNegative = 1;
}
string res = "";
while (1){
if (dec / 8 <= 0){
res.append(intToStr(dec));
break;
}
else{
res.append(intToStr(dec % 8));
dec = dec /8;
}
}
// cout<<"res:"<<res<<"res[0]"<<res[0]<<"\n";
string otc = "" ;
int l = res.length();
if(isNegative){
otc.append("-");
}
for(int i = l-1;i>=0;i--){
string x(1,res[i]); //使用string的构造函数将char类型转换为string类型
otc.append(x); //这里一直报错,看了半天原来str[0]返回的是char类型
}
return otc;
}
int main(){
int n;
cin>>n;
while(n>0){
n--;
string hex;
cin>>hex;
// getline(cin,hex);
int dec = hexToDec(hex);
// cout<<"dec:"<<dec<<"\n";
string otc = decToOtc(dec);
cout<<otc<<"\n";
}
}
c++同样运行超时,因为我看他的测试用例有十万位长,后同学提醒,肯定是先转十六先转二进制,再转八进制(十六进制对应二进制4位,八进制对应十六进制3位),python代码如下(这里省略了负数判定情况,题目给的输入全是正数,不想改了):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49#单个十六进制字符转四位二进制
def singleHexToBin(h):
h = str(h)
t = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
res = bin(t.index(h))
res = res[2:]
b = ''
if len(res) < 4:
for i in range(4-len(res)):
b = b + '0'
b = b + res
return b
#十六进制字符串转二进制,
def hexToBin(h):
b = ''
for x in h:
b = b + singleHexToBin(x)
while(True):
if b[0]!='0':
break
else:
b = b[1:]
return b
# 二进制字符串转八进制字符串
def binToOtc(b):
if (len(b) % 3) !=0:
z = 3 - ( len(b) % 3 )
if z == 1:
b = '0'+b
elif z == 2:
b = '00'+b
o = ''
t = ('000','001','010','011','100','101','110','111')
while(len(b)>0):
group = b[-3:]
o =str(t.index(group)) + o
b = b[:-3]
return o
if __name__ == "__main__":
n = int(input())
for i in range(n):
h = input()
b = hexToBin(h)
o = binToOtc(b)
print(o)
结果还是运行超时,还是用了python自带函数通过了,代码如下:1
2
3
4
5
6
7
8
9
10
11# 简单又快速,就是用的有点不好意思
# import time
# start = time.time()
n = int(input())
for i in range(n):
h = input()
res = oct(int(h,16))
res = str(res)
print(res[2:])
# end = time.time()
# print('time:',end-start)
第二题为十六进制转十进制,上面实现过了,代码如下:
1 | def hexToDec(hex): |
第三题为十进制转十六进制,原理和十进制转二进制一样(除二取余,倒叙排列),这里就是除16取余,倒序排列,然后把大于等于10的余数映射为A~F即可,代码如下:
1 | def decToHex(d): |