题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
# 分成3个函数1个正式检查 检查是否是正常的ip和mask 检查是否是正常掩码 检查是否是私有ip def check_ip(ip:str): ip_bit = ip.split('.') if len(ip_bit)!=4 or "" in ip_bit: return False for i in ip_bit: if int(i)<0 or int(i)>255: return False return True def check_mask(mask:str): if not check_ip(mask): # 错误 调用函数,不用(mask:str) return False if mask =="255.255.255.255" or mask == "0.0.0.0": return False mask_list = mask.split('.') # if len(mask_list) != 4: # return False mask_bit=[] for i in mask_list: i = bin(int(i)) i=i[2:] mask_bit.append(i.zfill(8)) whole_mask = ''.join(mask_bit) whole0_find = whole_mask.find("0") whole1_fine = whole_mask.rfind("1") if whole1_fine+1 == whole0_find: return True else: return False def check_private_ip(ip:str): ip_list = ip.split('.') if ip_list[0]=="10":return True if ip_list[0]=="172" and 16<=int(ip_list[1])<=31: return True if ip_list[0]=="192" and ip_list[1]=="168":return True return False ipClass2num = { 'A':0, 'B':0, 'C':0, 'D':0, 'E':0, 'ERROR':0, 'PRIVATE':0, } while True: try: s = input() ip = s.split('~')[0] mask = s.split('~')[1] if check_ip(ip): first=int(ip.split('.')[0]) if first==127 or first==0: continue if check_mask(mask): if check_private_ip(ip): ipClass2num['PRIVATE']+=1 if 0<first<127: ipClass2num['A'] +=1 elif 127<first<=191: ipClass2num['B']+=1 elif 192<=first<=223: ipClass2num['C']+=1 elif 224<=first<=239: ipClass2num['D']+=1 elif 240<=first<=255: ipClass2num['E']+=1 else: ipClass2num['ERROR']+=1 else: ipClass2num['ERROR']+=1 except: break for v in ipClass2num.values(): print(v,end=' ') # # 检查ip 或者mask 如果有空值,非4位,小于或者大于255的统统都是错误ip,返回false # def check_ip(ip:str): # ip_bit = ip.split('.') # if len(ip_bit) != 4 or '' in ip_bit: #ip 的长度为4 且每一位不为空 # return False # for i in ip_bit: # if int(i)<0 or int(i) >255: #检查Ip每一个10位的值范围为0~255 # return False # return True # # 掩码 是否 全部是111+000的形式 通过1的索引+1 = 0的所引 # def check_mask(mask:str): # #如果有空值 非4位 小于0大于255 在这个函数也是返回false # if not check_ip(mask): # return False # # 如果掩码 是开头 或者结尾 也是false # if mask == '255.255.255.255' or mask == '0.0.0.0': # return False # mask_list = mask.split('.') # # 是不是多余了? # if len(mask_list) != 4: # return False # # 将掩码按照每个8位数拼接 # mask_bit = [] # for i in mask_list:#小数点隔开的每一数字段 # i = bin(int(i))#每一数字段转换为每一段的二进制数字段 # i = i[2:] #从每一段的二进制数字段的第三个数开始,因为前面有两个ob # mask_bit.append(i.zfill(8)) #.zfill:返回指定长度的字符串,原字符串右对齐,前面填充0 # whole_mask = ''.join(mask_bit) # # print(whole_mask) # whole0_find = whole_mask.find("0")#查0从哪里开始 # whole1_rfind = whole_mask.rfind("1")#查1在哪里结束 # if whole1_rfind+1 == whole0_find:#两者位置差1位为正确 # #判断掩码是否正确 # return True # else: # return False # # 判断是否是私有 # def check_private_ip(ip:str): # # 三类私网 # ip_list = ip.split('.') # if ip_list[0] == '10': return True # if ip_list[0] == '172' and 16<=int(ip_list[1])<=31: return True # if ip_list[0] == '192' and ip_list[1] == '168': return True # return False # ipClass2num = { # 'A':0, # 'B':0, # 'C':0, # 'D':0, # 'E':0, # 'ERROR':0, # 'PRIVATE':0, # } # # 私有IP地址和A,B,C,D,E类地址是不冲突的,也就是说需要同时+1 # while True: # try: # s = input() # 输入 # ip = s.split('~')[0] # ip # mask = s.split('~')[1] # mask # if check_ip(ip): # 如果没有错误 # first = int(ip.split('.')[0]) # 第一位 # if first==127 or first==0: # 如果是0或者127 不属于任意类,continue # # 若不这样写,当类似于【0.*.*.*】和【127.*.*.*】的IP地址的子网掩码错误时,会额外计数 # continue # if check_mask(mask): # 如果掩码也没有问题 # if check_private_ip(ip): # 如果是私有的 # ipClass2num['PRIVATE'] += 1 # if 0<first<127: # ipClass2num['A'] += 1 # elif 127<first<=191: # ipClass2num['B'] += 1 # elif 192<=first<=223: # ipClass2num['C'] += 1 # elif 224<=first<=239: # ipClass2num['D'] += 1 # elif 240<=first<=255: # ipClass2num['E'] += 1 # else: # ipClass2num['ERROR'] += 1 # else: # ipClass2num['ERROR'] += 1 # except: # break # for v in ipClass2num.values(): # print(v,end=(' '))