题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import sys def is_valid_ip(ip): # 检查 IP 地址的合法性 parts = ip.split(".") if len(parts) != 4: return False for part in parts: if not part.isdigit() or not 0 <= int(part) <= 255: return False return True def is_valid_mask(mask): # 检查子网掩码的合法性 binary_mask = "".join(format(int(x), "08b") for x in mask.split(".")) # print(binary_mask) if "0" in binary_mask.rstrip("0") or binary_mask.strip("0") == "" or binary_mask.strip("1") == "": return False return True def classify_ip(ip, mask): ip_parts = list(map(int, ip.split("."))) a_range = range(1, 127) b_range = range(128, 192) c_range = range(192, 224) d_range = range(224, 240) e_range = range(240, 256) if not is_valid_ip(ip) or not is_valid_mask(mask): if ip_parts[0] != 0 and ip_parts[0] != 127: return "Error" if ip_parts[0] in a_range: if ip_parts[0] == 10 and 0 <= ip_parts[1] <= 255 and 0 <= ip_parts[2] <= 255 and 0 <= ip_parts[3] <= 255: return ["Private", "A"] return "A" elif ip_parts[0] in b_range: if ip_parts[0] == 172 and 16 <= ip_parts[1] <= 31 and 0 <= ip_parts[2] <= 255 and 0 <= ip_parts[3] <= 255: return ["Private", "B"] return "B" elif ip_parts[0] in c_range: if ip_parts[0] == 192 and ip_parts[1] == 168 and 0 <= ip_parts[2] <= 255 and 0 <= ip_parts[3] <= 255: return ["Private", "C"] return "C" elif ip_parts[0] in d_range: return "D" elif ip_parts[0] in e_range: return "E" else: if ip_parts[0] != 0 and ip_parts[0] != 127: return "Error" else: return "Not in Charge" # 统计各类别的个数 counts = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "Error": 0, "Private": 0, "Not in Charge":0} lines = [] # 输入多行字符串 for line in sys.stdin: a = line.strip("\n") lines.append(a) for line in lines: ip, mask = line.split("~") category = classify_ip(ip, mask) if type(category) is list: counts[category[0]] += 1 counts[category[1]] += 1 else: counts[category] += 1 # 输出统计结果 for i in counts.keys(): if i != "Not in Charge": print(counts[i], end=" ")