题解 | #判断两个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')