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

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

http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

# 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数
rst = [0,0,0,0,0,0,0]
# 判断掩码是否合法
def ismask(mask):
    mask_splits = mask.split(".")
    # 不足四位,存在空白,二进制全1,二进制全0
    if len(mask_splits) != 4 or '' in mask_splits or mask=='255.255.255.255' or mask == '0.0.0.0':
        return 0
    # 掩码转二进制
    s = ''
    for i in mask_splits:
        if int(i) < 0 or int(i) >255:
            return 0
        # 不足8位左补0
        s += str(bin(int(i)))[2:].rjust(8,'0')
    # 判断是否合法,即左侧全是1,右侧全是0
    left,right = 0,31
    while s[left] == '1':
        left += 1
    while s[right] =='0':
        right -= 1
    # 若合法,则right指针应在left左侧且相邻
    return right+1==left
    
# 判断ip类型及是否合法
def classip(ip):
    # 定义返回码 1代表A类 2代表B 3代表C 4代表D 5代表E 6代表私有 0代表错误
    code = ''
    sip = ip.split('.')
    # 不足4位或有空字符 直接返回错误码0
    if len(sip) != 4 or '' in sip:
        code += '0'
        return code
    # 存在越界 直接返回状态码0
    sip =list(map(int,sip))
    for i in sip:
        if i>255 or i<0:
            code += '0'
            return code
    # 判断三种内网
    if sip[0]==10 or (sip[0]==172 and 16<=sip[1]<=31) or(sip[0]==192 and sip[1]==168):
        code += '6'
    # 判断五类网
    code += '1' if 1<=sip[0]<=126 else ''  # A
    code += '2' if 128<=sip[0]<=191 else ''  # B
    code += '3' if 192<=sip[0]<=223 else ''  # C
    code += '4' if 224<=sip[0]<=239 else ''  # D
    code += '5' if 240<=sip[0]<=255 else ''  # E
    return code


while True:
    try:
        # 输入
        ip,mask = input().split('~')
        # 对ip判断,若为127或0开头,则跳过
        ipsplite = ip.split('.')
        if ipsplite[0] == '127' or ipsplite[0]=='0':
            continue
        # 获取ip对应的code
        code = classip(ip)
        # 若掩码错误,则 错误IP地址或错误掩码 +1
        if ismask(mask) == 0:
            rst[5] += 1
        # 否则根据code计算
        else:
            for i in code:
                if i == '0':
                    rst[5] += 1
                elif i == '6':
                    rst[6] += 1
                else:
                    rst[int(i)-1] += 1
    except:
        # 最终输出
        for i in rst:
            print(i,end=' ')
        break
全部评论

相关推荐

点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着接:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务