题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
def check_subnet_mask(subnet_mask): #判断子网掩码是否合法
b = subnet_mask
b = b.split('.')#拆分子网掩码
b_1 ='{:08b}'.format(int(b[0])) #每个十六进制转化为八位的二进制
b_2 ='{:08b}'.format(int(b[1]))
b_3 ='{:08b}'.format(int(b[2]))
b_4 ='{:08b}'.format(int(b[3]))
bin_subnet_mask = b_1+b_2+b_3+b_4 #合并为32位的二进制
for j in range(4): #若是空或者不是数字则认为是非法的
if(b[j] == '') | (b[j].isdigit() == 0):
return False
if(int(b[j]) < 0) | (int(b[j]) > 255): #若是<0或者>255也认为是非法的
return False
if(bin_subnet_mask == '00000000000000000000000000000000') | (bin_subnet_mask == '11111111111111111111111111111111'): #若是全0或者全1也认为是非法的
return False
bin_subnet_mask = list(bin_subnet_mask)
flag = 0
for j in range(32):
if(bin_subnet_mask[j] == '0'): #找到第一个为0的位置
flag = j
break
if('1' in bin_subnet_mask[flag+1:]): #若是后面还有1,则认为是非法的子网掩码
return False
return True
def check_ip(ip):
b = ip
b = b.split('.')
for j in range(4):
if(b[j] == '') | (b[j].isdigit() == 0): #若是ip为空或者不为数字,那么认为是非法的ip
return False
if(int(b[j]) < 0) | (int(b[j]) > 255): #若是大于0或者大于255,认为是非法的ip
return False
return True
while True:
try:
subnet_mast = input()
ip_1 = input()
ip_2 = input()
i = 1
if(check_subnet_mask(subnet_mast) == False) | (check_ip(ip_1) == False) | (check_ip(ip_2) == False): #若是有一个非法的,输出1
print(1)
else:
d = subnet_mast.split('.')
d_1 ='{:08b}'.format(int(d[0]))
d_2 ='{:08b}'.format(int(d[1]))
d_3 ='{:08b}'.format(int(d[2]))
d_4 ='{:08b}'.format(int(d[3]))
bin_subnet_mask = d_1+d_2+d_3+d_4
d = ip_1.split('.')
d_1 ='{:08b}'.format(int(d[0]))
d_2 ='{:08b}'.format(int(d[1]))
d_3 ='{:08b}'.format(int(d[2]))
d_4 ='{:08b}'.format(int(d[3]))
bin_ip_1 = d_1+d_2+d_3+d_4
d = ip_2.split('.')
d_1 ='{:08b}'.format(int(d[0]))
d_2 ='{:08b}'.format(int(d[1]))
d_3 ='{:08b}'.format(int(d[2]))
d_4 ='{:08b}'.format(int(d[3]))
bin_ip_2 = d_1+d_2+d_3+d_4
c_1 = []
c_2 = [] #将掩码,两个ip全部转化为32位二进制
for i in range(32):
c_1.append(int(bin_subnet_mask[i]) & int(bin_ip_1[i])) #两个ip分别于掩码进行与操作
c_2.append(int(bin_subnet_mask[i]) & int(bin_ip_2[i]))
if(c_1 == c_2):#若是相同,则认为是同一个子网
print(0)
else: #若是不同,则认为不是同一个子网
print(2)
except:
break
本题主要是对子网掩码进行一个验证,子网掩码必须是一串1后面全是0,如果出现11111111.11111111.11111111.00111111这种情况认为是非法的,因为后面的0要留做子网里面计算机的ip地址,当然全0和全1也认为是非法的
华为机试题解(prod.by kedao) 文章被收录于专栏
华为实习机试题解