题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
# 判断mask是否合法, i.e.,换成2进制后, 最后一个1的位置在第一个0的前边
def validmask(mask):
mask_str = ip2bin(mask)
pos_1 = [i for i,v in enumerate(mask_str) if v == '1'][-1]
pos_0 = [i for i,v in enumerate(mask_str) if v == '0'][0]
return True if pos_0-pos_1 == 1 else False
# 把ip换成2进制
def ip2bin(ip):
return ''.join([bin(k)[2::].zfill(8) for k in ip])
# 2进制"与"
def binadd(one, two):
r = ''
for i in range(len(one)):
if one[i] == '1' and two[i] == '1':
r+='1'
else:
r+='0'
return r
def samesubnet(mask,ip_1,ip_2):
mask = ip2bin(mask)
ip_1 = ip2bin(ip_1)
ip_2 = ip2bin(ip_2)
if binadd(mask,ip_1) == binadd(mask,ip_2):
return True
else:
return False
while True:
try:
mask = [int(k) for k in input().split('.') if 0<=int(k)<=255]
ip_1 = [int(k) for k in input().split('.') if 0<=int(k)<=255]
ip_2 = [int(k) for k in input().split('.') if 0<=int(k)<=255]
if (len(mask) == 4 and len(ip_1) == 4 and len(ip_2) == 4) and validmask(mask):
if samesubnet(mask,ip_1,ip_2):
print(0)
else:
print(2)
else:
print(1)
except:
break

