题解 | #识别有效的IP地址和掩码并进行分类统计#
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
难度不大,但是需要把题目看清楚,尤其题目例子和条件,一个都不能漏,如果不看清楚题目就开始写,就会漏掉很多情况。
本体难度在于掩码判断,个人觉得这个比较难想到用左移运算,想到这个就很简单了。
思路:
1.第一步:首先得判断IP是否合法,如果不合法,直接得出结果,不用继续判断。
2.第二步:IP合法,再判断子网掩码是否合法,如果子网掩码不合法,直接得出结果,不用继续判断。
3.第三步:子网掩码合法,再判断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))
查看13道真题和解析

