题解 | #判断两个IP是否属于同一子网#
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#相比于诸位大佬写的巧妙思路,我这个就是笨办法了 #最开始忽略了最重要的一点:子网掩码的二进制格式必须是连续1和连续的0,不能有夹杂类似‘101’ def judge(str1,str2,str3): #判断子网掩码和两个输入的ip是否合法 lis1=str1.split('.') lis2=(str1+'.'+str2+'.'+str3).split('.') #将三个一起判断,根据[.]分化进列表 tmp='' #单独判断子网掩码是否是连续的1,0 for i in lis1: tmp+= bin(int(i))[2:].rjust(8,'0') tmp=list(tmp) inde=tmp.index('0') #找到第一个‘0’的索引inde for j in tmp[inde:]: #切片从inde往后 if j=='1': #如果存在1,说明不合法,输出1 print('1') return False #合并判读三个ip的各段十进制是否都在[0,255]之间 for m in lis2: if int(m)>255 or int(m)<0: print('1') return False return True #将10进制的子网掩码和ip地址都转换为2进制,不足8位补齐,最后用[.]连接 def transfer(str2): lis2=str2.split('.') strres=[] for j in lis2: strres.append(bin(int(j))[2:].rjust(8,'0')) #二进制后要忽略前两位('ob'),rjust(8,'0')右对齐,不足8位的用0补齐 res='.'.join(strres) return res #将子网掩码和ip地址进行和运算,如果都为1且不是【.】则是1,如果都为0,且不是【.】则是0,如果不等则是0,如果是【.】则是【.】 def andyun(str3,str4): res='' for i in range(35): if str3[i]==str4[i] and str3[i]=='1': res+='1' elif str3[i]==str4[i] and str3[i]=='0': res+='0' elif str3[i]!=str4[i] and str3[i]!='.': res+='0' elif str3[i]=='.': res+='.' return res while True: try: zi=input() ip1=input() ip2=input() if judge(zi,ip1,ip2): zitr=transfer(zi) ip1tr=transfer(ip1) ip2tr=transfer(ip2) #如果两个各自的和运算结果不相等 if andyun(zitr,ip1tr)==andyun(zitr,ip2tr): print('0') else: print('2') except: Break