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

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

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

#请解析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范围是:
#从10.0.0.0到10.255.255.255
#从172.16.0.0到172.31.255.255
#从192.168.0.0到192.168.255.255
#子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
#(注意二进制下全是1或者全是0均为非法子网掩码)
# 注意:
# 1.类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
# 2.私有IP地址和A,B,C,D,E类地址是不冲突的

#输入:10.70.44.68~255.254.255.0(子网掩码非法)
#1.0.0.1~255.0.0.0(无误的A类地址)
#192.168.0.2~255.255.255.0(无误的C类地址且是私有IP)
#19..0.~255.255.255.0(IP地址非法)
#输出: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地址,计数时请忽略  
#这个版本比较好理解!🤭🤭🤭
import re
a,b,c,d,e,er,p,t = 0,0,0,0,0,0,0,0
try:
    while True:
        err = 0
        ip,mask = input().strip().split('~')
        sub_ip = ip.split('.')
        #总体判断是否合法IP:
        for i in sub_ip:
            if not i.isdigit() or int(i)<0 or int(i)>255:
                err = err + 1
                er = er + 1
                break
        #总体IP没有错
        if err == 0 and sub_ip[0] != '0' and sub_ip[0] != '127':
            #再判断子网掩码
            sub_mask = mask.split('.')
            tmp = bin((int(sub_mask[0])<<24)+(int(sub_mask[1])<<16)+(int(sub_mask[2])<<8)+int(sub_mask[3]))
            tmp = tmp[2:]
            if tmp.find('1')==-1 :
                err = err +1
                er = er + 1
            elif tmp.find('0')==-1 :
                err = err +1
                er = er + 1
            else:
                if '1' in tmp[tmp.index('0'):]:
                    err = err +1
                    er = er + 1
           #子网掩码没有错,继续判断类型
            if err == 0:
                #判断A类地址
                if  1 <=int(sub_ip[0])<= 126:
                    if sub_ip[0] == '10':
                        p = p +1
                    a = a+1
                #判断B类地址
                if  128 <=int(sub_ip[0])<= 191:
                    if sub_ip[0] == '172' and 16<=int(sub_ip[1])<=31:
                        p = p +1
                    b = b+1
                #判断C类地址
                if  192 <=int(sub_ip[0])<= 223:
                    if sub_ip[0] == '192' and sub_ip[1] == '168':
                        p = p +1
                    c = c+1
                #判断D类地址
                if  224 <=int(sub_ip[0])<= 239:
                    d = d+1    
                #判断E类地址
                if  240 <=int(sub_ip[0])<= 255:
                    e = e+1
except:
    pass
print('{} {} {} {} {} {} {}'.format(a,b,c,d,e,er,p))

#打开Python的大门#
全部评论
逻辑清晰,代码简洁。可恶,为什么不火啊😂
点赞 回复 分享
发布于 2023-10-12 17:43 北京
引入参数t多余了,还有err什么作用啊?中间变量吗?
点赞 回复 分享
发布于 2023-03-03 15:35 陕西

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务