# 判断子网掩码是否正确 def check_mask(l_mask): if l_mask.count("255") == 4 or l_mask.count("0") == 4: # 二进制下全是1或者全是0均为非法子网掩码 return False # 子网掩码为二进制下前面是连续的1,然后全是0 s = "" for i in l_mask: t = bin(int(i))[2:].zfill(8) s += t # print(s) index_0 = s.index("0") if len((s[:index_0])) != s[:index_0].count("1"): return False if len((s[index_0:])) != s[index_0:].count("0"): return False return True # 判断ip地址是否正确 def check_ip(l_ip): if "" in l_ip: # ip地址里面不能有空地址 return False if len((l_ip)) != 4: # ip地址的长度必须是4 return False for i in l_ip: if int(i) < 0 or int(i) > 255: # ip地址里面的每一项数字范围必须是1~255 return False return True # 如果以上3种情况都没有出现,就说明它是一个合法的ip地址 # 判断是否是ABCDE类地址 def check_type(l_ip): num = int(l_ip[0]) if 1 <= num and num <= 126: return "A" if 128 <= num and num <= 191: return "B" if 192 <= num and num <= 223: return "C" if 224 <= num and num <= 239: return "D" if 240 <= num and num <= 255: return "E" # 判断私有 def check_private(l_ip): num0 = int(ip[0]) num1 = int(ip[1]) if num0 == 10: return True if num0 == 172: if 16 < num1 and num1 < 31: return True if num0 == 192 and num1 == 168: return True return False d = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "ERROR": 0, "PRIVATE": 0} while True: try: ip, mask = input().split("~") ip = ip.split(".") mask = mask.split(".") # print(ip,mask) if ( ip[0] == "0" or ip[0] == "127" ): # 1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略 continue if check_ip(ip) and check_mask(mask): if check_private(ip): d["PRIVATE"] += 1 if check_type(ip): d[check_type(ip)] += 1 else: d["ERROR"] += 1 except: break for i in d.values(): print(i, end=" ")