一、题目
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为 A,B,C,D,E五类
A类地址从1.0.0.0到126.255.255.255;
B类地址从128.0.0.0到191.255.255.255;
C类地址从192.0.0.0到223.255.255.255;
D类地址从224.0.0.0到239.255.255.255;
E类地址从240.0.0.0到255.255.255.255
私网IP范围是:
从10.0.0.0到10.255.255.255
从172.16.0.0到172.31.255.255
从192.168.0.0到192.168.255.255
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)(注意二进制下全是1或者全是0均为非法子网掩码)
注意:
- 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
- 私有IP地址和A,B,C,D,E类地址是不冲突的
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
二、示例
三、代码
import sys
res = [0,0,0,0,0,0,0]
def fun_ip(ip): # 判断地址分类
if 1 <= ip[0] <= 126:
res[0] += 1
if 128 <= ip[0] <= 191:
res[1] += 1
if 192 <= ip[0] <= 223:
res[2] += 1
if 224 <= ip[0] <= 239:
res[3] += 1
if 240 <= ip[0] <= 255:
res[4] += 1
if (ip[0] == 10) or (ip[0] == 172 and 16 <= ip[1] <= 32) or (ip[0] == 192 and ip[1] == 168):
res[6] += 1
return None
def fun_mask(mask): # 判断掩码合法性
temp = (mask[0] << 24) + (mask[1] << 16) + (mask[2] << 8) + mask[3]
if temp == 0 or (temp+1) == (1<<32) or '0' in bin(temp).strip('0'):
return False
return True
for IP in sys.stdin:
ip, mask = IP.strip().split('~')
list_ip = [int(x) for x in filter(None, ip.split('.'))]
list_mask = [int(x) for x in filter(None, mask.split('.'))]
if list_ip[0] == 0 or list_ip[0] == 127:
continue
elif len(list_ip) < 4 or len(list_mask) < 4:
res[5] += 1 # 错误IP地址或错误掩码数+1
elif fun_mask(list_mask) == True:
fun_ip(list_ip)
else:
res[5] += 1 # 错误IP地址或错误掩码数+1
print(' '.join(map(str, res)))
四、算法说明
- 定义列表
res
存储每一类地址的个数; - 定义函数
fun_ip
判断IP地址属于A,B,C,D,E,私网IP
中的哪一类; - 定义函数
fun_mask
判断掩码地址是否合法:- 首先将掩码地址转化为32位数字,全是1或者全是0,为非法掩码,返回
False
; - 然后将32位掩码转化为二进制,用
strip
函数去除头尾的'0'
后,如果还有'0'
在字符串中,为非法掩码,返回False
;
注: 如果是合法的掩码,在连续的1中,是没有0的,例如:0b11111111111111101111111100000000
0b11111111000000000000000000000000
0b11111111111111111111111100000000
第一个即为非法掩码。
- 首先将掩码地址转化为32位数字,全是1或者全是0,为非法掩码,返回
- 在主程序中,首先进行一波筛选,对于
【0.*.*.*】和【127.*.*.*】
的IP地址忽略不计,对IP地址掩码长度小于4的,计入错误类型。
胡萝卜
2022年3月18日14:26:19
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |