题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import sys
def maskvalid(mask): #判断掩码是否有效,有效=1,无效=0,输入为原始字符串
mask = mask.split('.') #按.拆分成4部分。题目限定为4部分,否则需要对部分的数量容错。
if len([x for x in mask if int(x)>=0 and int(x)<=255]) != 4:
#如果4部分数中有超出0-255的,返回0,直接退出
return 0
#不要写成res=0 return res,因为后边还要做判断,如果此处已经出错,而下一句转换不成功的话则可能出现意外错误。
mask = ''.join(['{:0>8}'.format(bin(int(x))[2:]) for x in mask]) #各段拼接成8为二进制,再拼接
if ('01' in mask) or ('0' not in mask) or (int(mask,2)==0):
#如果掩码中有'01'或全为1或全为0,返回0直接退出
return 0
return 1 #没发现任何错误则返回1
def ipvalid(ip): #判断ip是否有效,有效=1,无效=0,输入为原始字符串
res = 1 #由于后续不需要操作ip,此处可以预置一个结果变量。
ip = ip.split('.') #将ip按.拆分成4份
if len([x for x in ip if int(x)>=0 and int(x)<=255]) != 4:
#判断是否有超出0-255的部分,若有则返回0,否则返回1
res = 0
return res
def matchip(mask,ip): #匹配掩码和字符串函数,输入均为原始未分隔字符串
mask = ''.join(['{:0>8}'.format(bin(int(x))[2:]) for x in mask.split('.')])
ip = ''.join(['{:0>8}'.format(bin(int(x))[2:]) for x in ip.split('.')])
#将掩码和ip均按.拆分后,各自转换并不全为4个8位二进制数
res = '' #预置结果位空
for i in range(4): #按位部分对掩码和ip进行与操作,而后拼接成结果。先拼接再比较亦可。
res += str(int(mask[(8*i):(8*i+8)],2)&int(ip[(8*i):(8*i+8)],2))
return res #返回结果。
def subnet(mask,ip1,ip2): #比较ip是否在同一子网
if all([maskvalid(mask),ipvalid(ip1),ipvalid(ip2)]) == False:
#如果掩码或ip1,ip2有任一非法,则直接报错,返回结果res=1
res = 1
else:
matchip1 = matchip(mask,ip1) #匹配掩码和ip1
matchip2 = matchip(mask,ip2) #匹配掩码和ip2
if matchip1 == matchip2: #如果结果相同返回0,否则返回2
res = 0
else:
res = 2
return res
res = []
for i in range(1):
mask = input()
ip1 = input()
ip2 = input()
res.append(subnet(mask,ip1,ip2))
print(*(res),sep='\n')