题解 | #识别有效的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)
