【华为机试Python3题解】HJ18识别有效的IP地址和掩码并进行分类统计

题目介绍

  • 原题链接:HJ18 识别有效的IP地址和掩码并进行分类统计
  • 描述:请解析IP地址和对应的掩码,进行分类识别。要求按照A、B、C、D、E类地址归类,不合法的地址和掩码单独归类。
  • 所有的IP地址划分为 A、B、C、D、E五类:
    A类地址从1.0.0.0126.255.255.255
    B类地址从128.0.0.0191.255.255.255
    C类地址从192.0.0.0223.255.255.255
    D类地址从224.0.0.0239.255.255.255
    E类地址从240.0.0.0255.255.255.255
  • 私网IP范围是:
    10.0.0.010.255.255.255
    172.16.0.0172.31.255.255
    192.168.0.0192.168.255.255
  • 子网掩码为二进制下前面是连续的1,然后全是0。例如:255.255.255.32就是一个非法的掩码(注意二进制下全是1或者全是0均为非法子网掩码)
  • 注意:
    1. 类似于0.*.*.*127.*.*.*的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
    2. 私有IP地址和A,B,C,D,E类地址是不冲突的
  • 输入描述:多行字符串。每行一个IP地址和掩码,用~隔开。请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
  • 输出描述:统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
  • 示例1
    输入:
    10.70.44.68~255.254.255.0
    1.0.0.1~255.0.0.0
    192.168.0.2~255.255.255.0
    19..0.~255.255.255.0
    
    输出:1 0 1 0 0 2 1
    说明:10.70.44.68~255.254.255.0的子网掩码非法,19..0.~255.255.255.0的IP地址非法,所以错误IP地址或错误掩码的计数为2;1.0.0.1~255.0.0.0是无误的A类地址;192.168.0.2~255.255.255.0是无误的C类地址且是私有IP;
    所以最终的结果为1 0 1 0 0 2 1
  • 示例2
    输入:
    0.201.56.50~255.255.111.255
    127.201.56.50~255.255.111.255
    
    输出:0 0 0 0 0 0 0
    说明:类似于0.*.*.*127.*.*.*的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略

题解:先转为32位的二进制数再比较

get_bin方法用于将用“点分十进制”表示的IP地址转为一个32位的二进制数,以方便后期的比较

"""
题解:先转为32位的二进制数再比较
"""
import re

A, B, C, D, E, errs, privates = 0, 0, 0, 0, 0, 0, 0


def get_bin(string):
    """
    将点分十进制的IP地址转成二进制的形式
    :param string:点分十进制的IP地址字符串
    :return:物理层的二进制序列字符串
    """
    string_bin = ''
    for i in string.split('.'):
        string_bin += bin(int(i))[2:].rjust(8, '0')
    return string_bin


try:
    while True:
        ip, mask = input().split('~')
        mask_bin = get_bin(mask)
        if ip.split('.')[0] in ('0', '127'):
            continue
        if mask in ('0.0.0.0', '255.255.255.255'):
            errs += 1
            continue
        if re.search('01', mask_bin):
            errs += 1
            continue
        ip_bin = get_bin(ip)
        if re.search(r'\.\.', ip):
            errs += 1
        elif get_bin('1.0.0.0') < ip_bin < get_bin('126.255.255.255'):
            A += 1
            if get_bin('10.0.0.0') < ip_bin < get_bin('10.255.255.255'):
                privates += 1
        elif get_bin('128.0.0.0') < ip_bin < get_bin('191.255.255.255'):
            B += 1
            if get_bin('172.16.0.0') < ip_bin < get_bin('172.31.255.255'):
                privates += 1
        elif get_bin('192.0.0.0') < ip_bin < get_bin('223.255.255.255'):
            C += 1
            if get_bin('192.168.0.0') < ip_bin < get_bin('192.168.255.255'):
                privates += 1
        elif get_bin('224.0.0.0') < ip_bin < get_bin('239.255.255.255'):
            D += 1
        elif get_bin('240.0.0.0') < ip_bin < get_bin('255.255.255.255'):
            E += 1
except (EOFError, ValueError):
    pass
print(A, B, C, D, E, errs, privates)

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

COCO56(徐可可)

建议微信红包:xucoco56

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值