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

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

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

while True:
    try:
        s1 = input().split('.')
        s2 = input().split('.')
        s3 = input().split('.')
        s4 = ''
        for i in s1:
            s4 += bin(int(i))[2:]
        s4 = s4.lstrip('1')  #把子网掩码第一个0前面的1全去掉了,后面不能有1了,当然第一个数也不能有0
        for i in range(len(s1)):
                s1[i] = int(s1[i])
                s2[i] = int(s2[i])
                s3[i] = int(s3[i])
        if s1[0] != 255 or'1' in s4 or max(s1+s2+s3) > 255 or min(s1+s2+s3) < 0:
            print(1)
        else:
            a = []
            b = []
            for i in range(len(s2)):
                a.append(s1[i]&s2[i])
                b.append(s1[i]&s3[i])   #十进制默认可以&运算,应该自动转2进制运算完再返回十进制的
            if a == b:
                print(0)
            else:
                print(2)
    except:
        break
这个题有两个可以说的点:1. 判别子网掩码和ip地址是否合法  
                                        (1子网掩码)我用的方法是把第一个0前面的1全部去掉看看后面是否有1,有的话子网掩码就不合法其实,但是第一个数的二进制也不能有0,即第一个数还是得是255
                                        (2 ip地址)我借鉴别人的把三个list合成长list然后看里面有没有不合法(>255 or <0)的数
                                           2. 十进制直接&运算
全部评论
s4 += bin(int(i))[2:].rjust(8, '0') if s1 in ('0.0.0.0', '255.255.255.255') or re.search('01', s4) 非法
点赞 回复 分享
发布于 2023-05-25 20:12 江苏
子网掩码判断逻辑有问题 第一位不一定是255 二进制下 1和0连续就可以 比如11110 是254 也是合法的,还有全1全0 也是非法的
点赞 回复 分享
发布于 2023-05-25 20:11 江苏

相关推荐

03-11 10:06
已编辑
河南师范大学 C++
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务