题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#判断IP是否合法
def check_ip(s):
for i in s:
#每一位必须在0-255,否则IP非法
if int(i) < 0 or int(i) > 255:return False
return True
#判断子网掩码是否合法
def check_mask(s):
#先判断是否为合法IP,如果非法IP那么一定也是非法子网掩码
if not check_ip(s):
return False
#定义空字符串用于存子网掩码转换为二进制后的字符串
res = ''
#bin函数取出的字符串前面包含'0b',[2:]的目的是直接取出后面的数值,去掉'0b'
#还应当注意子网掩码每个数字转换二进制后必须是8位,用rjust函数在不够8位的地方补'0'
#如果不是8位可能会出现判断错误的情况,例:255.255.255.32
for i in s:res += bin(int(i))[2:].rjust(8,'0')
return res.rfind('1') + 1 == res.find('0')
#判断是否为同一子网
#通过直接想与进行判断
def check_same(mask , ip1 , ip2):for i in range(4):
if int(ip1[i]) & int(mask[i]) != int(ip2[i]) & int(mask[i]):
return False
return True
while 1:
try:
mask_list = input().split('.')
ip1_list = input().split('.')
ip2_list = input().split('.')
if not check_ip(ip1_list) or not check_ip(ip2_list) or not check_mask(mask_list):
print(1)
continue
if check_same(mask_list , ip1_list , ip2_list):
print(0)
continue
else:
print(2)
continue
except:
break