题解 | #判断两个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) 文章被收录于专栏

华为实习机试题解

全部评论

相关推荐

牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务