题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682?tpId=37&tags=&title=&difficulty=0&judgeStatus=0&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37
''' A, B, C, D, E, errors, privates一共7类,步骤如下: 1.判断是否为无效地址('0','127'开头) 2.判断格式有误的地址 3.判断掩码无效的地址 4.判断A, B, C, D, E类地址(处理合理地址) 5.判断私有地址(私有地址也为A, B, C类的合法地址,所以最后判断) ''' import string import sys A, B, C, D, E, errors, privates = 0, 0, 0, 0, 0, 0, 0 def getBin(string):#合理地址转化为二进制方便比较 return ''.join(map(lambda item:format(int(item),'08b'),string.split('.'))) for line in sys.stdin: ip,mask = line.replace('\n','').split("~") if ip.split('.')[0]=='0' or ip.split('.')[0]=='127':#判断ip是否一'0'或'127开头',是抛弃,不是继续 continue if '' in ip.split('.') or '' in mask.split('.'):#判断是否残缺ip或掩码,是errors+1,不是继续 errors+=1 continue #剩余为格式无误的ip和掩码,可以转化为二进制数进行判断 bin_ip=getBin(ip) bin_mask=getBin(mask) i_mask=0 for i in range(len(bin_mask)-1,-1,-1):#找掩码分界线 if bin_mask[i] !='0': i_mask=i break if bin_mask[:i_mask].count('0')>0 or bin_mask in (getBin('0.0.0.0'),getBin('255.255.255.255')) :#判断非法掩码,是errors+1,不是继续 errors+=1 continue #剩余为合法ip和掩码数据,进行A,B,C,D,E类分类 if int(getBin('1.0.0.0'))<=int(bin_ip)<=int(getBin('126.255.255.255')): A+=1 elif int(getBin('128.0.0.0'))<=int(bin_ip)<=int(getBin('191.255.255.255')): B+=1 elif int(getBin('192.0.0.0'))<=int(bin_ip)<=int(getBin('223.255.255.255')): C+=1 elif int(getBin('224.0.0.0'))<=int(bin_ip)<=int(getBin('239.255.255.255')): D+=1 elif int(getBin('240.0.0.0'))<=int(bin_ip)<=int(getBin('255.255.255.255')): E+=1 #判断是否为私域ip(私域地址属于A,B,C类地址,所以要最后判断) if int(getBin('10.0.0.0'))<=int(bin_ip)<=int(getBin('10.255.255.255')) or int(getBin('172.16.0.0'))<=int(bin_ip)<=int(getBin('172.31.255.255')) or int(getBin('192.168.0.0'))<=int(bin_ip)<=int(getBin('192.168.255.255')): privates+=1 print(A, B, C, D, E, errors, privates)