python3练习-华为机试

描述

原理: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

这是我一开始写的代码:

差点理解错题意了

import re


# 十进制转二进制,t是一个整数,返回补齐8位的二进制数字符串
def d_b_8(t):
    t_b = []
    while t / 2:
        t_s = t % 2
        t = t // 2
        temp = str(t_s)
        t_b.append(temp)
    t_b.reverse()
    t_str = "".join(t_b)  # TypeError: sequence item 0: expected str instance, int found 原因是t_b列表是整形的
    t_str_1 = t_str.rjust(8, '0')  # 不够前面补0
    return t_str_1


# 十进制转二进制,x是一个整数,返回补齐32位的二进制数字符串
def d_b_32(x):
    x_b = []
    while x / 2:
        x_s = x % 2
        x = x // 2
        temp = str(x_s)
        x_b.append(temp)
    x_b.reverse()
    x_str = "".join(x_b)  # TypeError: sequence item 0: expected str instance, int found 原因是t_b列表是整形的
    x_str_1 = x_str.rjust(32, '0')  # 不够前面补0
    return x_str_1


# 处理IP地址形式,n是列表
def ip_deal(n):
    # print(n)
    # print(type(n))
    list_int = [int(i) for i in n]
    # print(list_int)
    str_b = ""
    for j in list_int:
        str_b = str_b + d_b_8(j)
    print(int(str_b, 2))


# 处理整数形式,s是整数
def data_deal(s):
    # print(s)
    # print(type(s))
    s_b = d_b_32(s)
    data = []
    for i in range(4):
        data_1 = s_b[i * 8:(i + 1) * 8]
        data_2 = int(data_1, 2)
        temp = str(data_2)
        data.append(temp)
    # print(''.join(data))
    print(data[0]+'.'+data[1]+'.'+data[2]+'.'+data[3])


# 接受处理
str_1 = input()
str_2 = input()
list_1 = str_1.split(".")
ip_deal(list_1)
data_deal(int(str_2))
# if re.findall(r'\.', str_1):
#     list_1 = str_1.split(".")
#     ip_deal(list_1)
# else:
#     data_deal(int(str_1))

这是优化后的代码

ip = input()
num = int(input())
ip_list = ip.split(".")
ip_bin_all = ""
for i in range(4):
    ip_bin = bin(int(ip_list[i]))[2:].rjust(8, '0')
    ip_bin_all = ip_bin_all + ip_bin
print(int(ip_bin_all, 2))
num_bin = bin(num)[2:].rjust(32, '0')
num_ips = ""
for i in range(4):
    num_ip = str(int(num_bin[i * 8:(i + 1) * 8], 2))
    if i == 3:
        num_ips += num_ip
    else:
        num_ips += num_ip+"."
print(num_ips)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值