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