本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目来自牛客网的华为机试题库,本题目为中等题HJ33 整数与IP地址间的转换
HJ33 整数与IP地址间的转换
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入:
10.0.3.193
167969729
输出:
167773121
10.3.3.193
代码
我写的ip转数字
t = list(map(int,input().split('.')))
def turn_2(t):
re = ''
while t > 0:
if t % 2 == 0:
re = '0' + re
else:
re = '1' + re
t //= 2
k = 8 - len(re)
re = '0'*k + re
return re
res = ''
for i in range(len(t)):
res += turn_2(t[i])
re = 0
n = 0
for i in range(len(res)-1,-1,-1):
if res[i] == '1':
re += 2**n
n += 1
print(re)
其他人写的
while True:
try:
ip = input()
num = input()
except:
break
else:
# ip to num
ip_list = ip.split('.')
ip2num = str()
for i in ip_list:
a = bin(int(i,10))[2:]
a = '0'*(8-len(a)) + a if len(a)<8 else a
ip2num += a
print(int(ip2num,2))
# num to ip
num2ip = []
num2 = bin(int(num,10))[2:]
num2 = '0'*(32-len(num2)) + num2 if len(num2)<32 else num2
for i in range(4):
b = num2[8*i:8*i+8]
b = str(int(b,2))
num2ip.append(b)
print('.'.join(num2ip))
解析
我写的还是想法简单粗暴,写起来稍显复杂。定义了一个函数turn_2,把十进制转化成二进制,转化之后再从二进制最后一位乘回去。
高手会使用工具,用bin(int(i,10))[2:]把十进制转化成二进制。