题解 | #判断两个IP是否属于同一子网#

判断两个IP是否属于同一子网

https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

#判断IP是否合法
def check_ip(s):
    for i in s:
        #每一位必须在0-255,否则IP非法
        if int(i) < 0 or int(i) > 255:
            return False
    return True
#判断子网掩码是否合法
def check_mask(s):
    #先判断是否为合法IP,如果非法IP那么一定也是非法子网掩码
    if not check_ip(s):
        return False
    #定义空字符串用于存子网掩码转换为二进制后的字符串
    res = ''
    #bin函数取出的字符串前面包含'0b',[2:]的目的是直接取出后面的数值,去掉'0b'
    #还应当注意子网掩码每个数字转换二进制后必须是8位,用rjust函数在不够8位的地方补'0'
    #如果不是8位可能会出现判断错误的情况,例:255.255.255.32
    for i in s:
        res += bin(int(i))[2:].rjust(8,'0')
    return res.rfind('1') + 1 == res.find('0')
#判断是否为同一子网
#通过直接想与进行判断
def check_same(mask , ip1 , ip2):
    for i in range(4):
        if int(ip1[i]) & int(mask[i]) != int(ip2[i]) & int(mask[i]):
            return False
    return True
while 1:
    try:
        mask_list = input().split('.')
        ip1_list = input().split('.')
        ip2_list = input().split('.')

        if not check_ip(ip1_list) or not check_ip(ip2_list) or not check_mask(mask_list):
            print(1)
            continue
        if check_same(mask_list , ip1_list , ip2_list):
            print(0)
            continue
        else:
            print(2)
            continue
    except:
        break

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务