牛客网学习笔记(HJ33 整数与IP地址间的转换)

123 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为中等题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:]把十进制转化成二进制。