题解 | #识别有效的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))