题解 | #识别有效的IP地址和掩码并进行分类统计#

# 请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
# 所有的IP地址划分为 A,B,C,D,E五类
# A类地址从1.0.0.0到126.255.255.255;
# B类地址从128.0.0.0到191.255.255.255;
# C类地址从192.0.0.0到223.255.255.255;
# D类地址从224.0.0.0到239.255.255.255;
# E类地址从240.0.0.0到255.255.255.255

# 要求地址的IP和掩码全部真确,才能计入
# #      A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数
# res = [0, 0, 0, 0, 0, 0, 0]
def isip(ip):
    # 判断长度
    if 1 <= ip[0] <= 126:
        res[0] += 1
    elif 128 <= ip[0] <= 191:
        res[1] += 1
    elif 192 <= ip[0] <= 223:
        res[2] += 1
    elif 224 <= ip[0] <= 239:
        res[3] += 1
    elif 240 <= ip[0] <= 255:
        res[4] += 1
    else:
        res[5] += 1

# 私有IP判断
# 私网IP范围是:
# 从10.0.0.0到10.255.255.255
# 从172.16.0.0到172.31.255.255
# 从192.168.0.0到192.168.255.255
def is_syip(ip):
    if ip[0] == 10:
        res[6] += 1
    elif ip[0] == 172 and 16 <= ip[1] <= 31:
        res[6] += 1
    elif ip[0] == 192 and ip[1] == 168:
        res[6] += 1

# 判断掩码是否为合格掩码,前面全是1,后面全是0,不存在1和0交叉的情况
def isym(ym):
    # print(ym)
    yms = '' # 存储转为2进制且拼接起来的值
    for i in ym:
        j = str(bin(i)).replace('0b', '')
        j = '0' * (8 - len(j)) + j
        yms += j
    # print(yms)
    index0 = yms.find('0') # 从左到右 0 第一次出现的位置
    index1 = yms.rfind('1') # 从右到左 1 第一次出现的位置
    # 易知:当为在正常的掩码是,index0 - index1 的值应 恒等于 1
    if index0 != -1 and index1 != -1 and index0 - index1 == 1:
        return True
    else:
        return False

# 声明全局变量,保存结果
#      A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数
if __name__ == '__main__':
    res = [0, 0, 0, 0, 0, 0, 0]
    while True:
        try:
            ip, ym = input().split('~')
            ip = list(map(int, filter(None, ip.split('.'))))
            ym = list(map(int, ym.split('.')))
            if ip[0] == 0 or ip[0] == 127:
                    continue
            elif len(ip) == 4 and len(ym) == 4:
                if isym(ym):
                    # 掩码判断真确,进行IP的判断
                    isip(ip)
                    # 私有IP判断
                    is_syip(ip)
                else:
                    res[5] += 1
            else:
                res[5] += 1  # 掩码错误,计数 + 1
        except:
            break
    print(' '.join(list(map(str, res))))
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务