题解 | #判断两个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                                                        


全部评论

相关推荐

05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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