题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
def f1(lst_ip): """ 判断ip四个数字是否0~255 :param ip: 列表,四个数字 :return: 0 非法 1 通过 """ for i in lst_ip: if i >= 0 and i <= 255: continue else: return 0 return 1 def f2(lst_mask): """ 判断是不是m个1接n个0 :param lst_mask: 掩码四个数字组成的列表 :return: 1 合法 0 非法 """ s = "" for i in lst_mask: d = bin(i)[2:] if len(d) < 8: n = 8 - len(d) s += "0" * n s += bin(i)[2:] for i in range(len(s)): if s[i] == "1": continue else: if int(s[i:]) == 0: return 1 else: return 0 def f3(lst_mask, lst_ip1, lst_ip2): """ 判断两个ip与掩码与运算后是否相等 :param lst_mask: mask列表,四个数字 :param lst_ip1: ip1列表,四个数字 :param lst_ip2: ip2列表,四个数字 :return: 0 结果不同 1 结果相同 """ for i in range(len(lst_ip1)): a1 = lst_mask[i] a2 = lst_ip1[i] a3 = lst_ip2[i] r1 = a1 & a2 r2 = a1 & a3 if r1 != r2: return 0 return 1 def f(mask, ip1, ip2): # 2. 通用判断: 是否都是4个部分 if len(mask) == 4 and len(ip1) == 4 and len(ip2) == 4: pass else: return 1 # 长度非法 # 3. 判断每段的值是否合法: 0~255 for i in (mask, ip1, ip2): if not f1(i): return 1 # 长度非法 # 4. 判断子网掩码是否合法: 换算为2进制后左1右0 if not f2(mask): return 1 # 长度非法 # 5. 2个ip进行与运算 if f3(mask, ip1, ip2): return 0 # 结果相同属于同一子网 else: return 2 # 结果不同不属于同一子网 while True: try: # 1. 把输入的值变为数值型列表 mask = list(map(int, input().split("."))) ip1 = list(map(int, input().split("."))) ip2 = list(map(int, input().split("."))) r = f(mask, ip1, ip2) print(r) except: break