题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
def is_valid_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): if not is_valid_ip(mask): return False binary_str = ''.join(f'{int(x):08b}' for x in mask.split('.')) if '01' in binary_str or binary_str == '0'*32 or binary_str == '1'*32: return False return True def ip_class(ip): parts = list(map(int, ip.split('.'))) if 1 <= parts[0] <= 126: return 'A' elif 128 <= parts[0] <= 191: return 'B' elif 192 <= parts[0] <= 223: return 'C' elif 224 <= parts[0] <= 239: return 'D' elif 240 <= parts[0] <= 255: return 'E' return 'Error' def is_private_ip(ip): parts = list(map(int, ip.split('.'))) if parts[0] == 10: return True if parts[0] == 172 and 16 <= parts[1] <= 31: return True if parts[0] == 192 and parts[1] == 168: return True return False import sys input = sys.stdin.read data = input().strip().split('\n') counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'Error': 0, 'Private': 0} for line in data: if '~' not in line: continue ip, mask = line.split('~') if ip.split('.')[0] in {'0', '127'}: # 检查是否是特殊IP段,如果是则跳过 continue if not (is_valid_ip(ip) and is_valid_mask(mask)): counts['Error'] += 1 continue cls = ip_class(ip) if cls == 'Error': counts['Error'] += 1 else: counts[cls] += 1 if is_private_ip(ip): counts['Private'] += 1 output = ' '.join(str(counts[key]) for key in ['A', 'B', 'C', 'D', 'E', 'Error', 'Private']) print(output)