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