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