题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
mask = input().strip().split(".")
ip1 = input().strip().split(".")
ip2 = input().strip().split(".")
def identify(mask: list[str], ip1: list[str], ip2: list[str]):
if not identify_mask(mask) or not identify_ip(ip1) or not identify_ip(ip2):
print(1)
return
for i in range(4):
res1 = logic_and(mask[i], ip1[i])
res2 = logic_and(mask[i], ip2[i])
if res1 != res2:
print(2)
return
print(0)
def identify_mask(mask: list[str]):
if len(mask) != 4:
return False
if mask[0] == "0" or mask[3] == "255":
return False
for i in range(4):
if not mask[i].isnumeric():
return False
if mask[i] == "0":
if i < 3:
if mask[i + 1] != "0":
return False
continue
temp = int(mask[i])
if 0 < temp < 128 or (not 0 <= temp <= 255):
return False
# 判断二进制形式是否为连续的1
for j in range(7, -1, -1):
temp -= 2 ** j
if temp < 0:
return False
elif temp == 0:
if i != 3 and j > 0:
# 不是255但是是其他二进制是连续的1的数,那么mask中剩余的数必须都是0才是合法的mask
if mask[i + 1 :].count("0") != 4 - i - 1:
return False
break
return True
def identify_ip(ip: list[str]):
if len(ip) != 4:
return False
for i in ip:
if not i.isnumeric():
return False
temp = int(i)
if not 0 <= temp <= 255:
return False
return True
def logic_and(mask: str, ip: str):
ma = bin(int(mask))[2:]
pi = bin(int(ip))[2:]
if len(ma) < 8:
ma = '0' * (8-len(ma)) + ma
if len(pi) < 8:
pi = '0' * (8-len(pi)) + pi
o = []
for i in range(8):
t1 = ma[i]
t2 = pi[i]
o.append(str(int(t1) & int(t2)))
return ''.join(o)
identify(mask, ip1, ip2)

