1、掩码校验 我在了解了子网掩码的概念后,感觉最难的反而是子网掩码的判断上面 11111111 11111111 11111111 10000000#这个也是子网掩码 11111111 11111111 11111111 10100000#这个就不是子网掩码 因为101中间有个0,不满足他说的前缀都是1,这种情况 于是我的思路就是把所有已知情况都列出来 ymlst=["11111111","11111110","11111100","11111000","11110000","11100000","11000000","10000000","00000000"] 掩码在满足这个ip的情况下,1的还得递减,毕竟255.0.255.0这种就是不满足的

2、掩码运算 然后与计算经过测试发现完全可以用数字进行运算,比如192&255=192他是能算出来的。

3、ip校验 除了满足0-255之外,还要考虑一种情况,192.168.01.01#这种01的应该也是不行的,所以要加一个不能startwith(0)来校验

之后就简单了,代码如下:

``` python []
#写个判断if是否合法的函数吧
def iphf(lst):
    tmp=3#区分1和2
    if len(lst)<4:#判断是否是4个
        tmp=0
    for i in lst:#判断ip是否合理
        if int(i)>255 or int(i)<0 or (len(i)>1 and i.startswith('0')):#第三个or是考虑01.02这种情况的
            tmp=1#非法输入
    return(tmp)

#写个字符串数字转换成2进制的函数:
def strtobin(s):
    tmp=bin(int(s))[2:].rjust(8,"0")#直接int(s)就行了
    return tmp
#将ip和掩码带入进行演算
def zwys(ip,ym):
    tmp=[]
    for i in range(4):#已经通过条件了,所以直接运算
        a=int(ip[i])&int(ym[i])#直接转换成int类型,与就可以了,测试出来的
        #print(a)#测试用
        tmp.append(a)
    return tmp

while True:
    try:
        flag=[]#定义一个flag数组吧,到时候全加到里面去
        #1、先判断是否非法
        #输入的是掩码
        ym=list(map(str,input().split(".")))
        IP1=list(map(str,input().split(".")))
        IP2=list(map(str, input().split(".")))
        flag.append(iphf(IP1))#判断ip是否合法
        flag.append(iphf(IP2))
        #判断子网掩码是否合法
        tmpym=[]
        ymlst=["11111111","11111110","11111100","11111000","11110000","11100000","11000000","10000000","00000000"]
        if iphf(ym)!=1:#首先需要满足正常ip属性
            tmplen=8#用来记录值,以达到一个递减的效果,最大值为8
            for i in ym:
                tmpym.append(strtobin(i))
            for i in tmpym:
                if str(i) in ymlst:#如果在这个里面
                    f=tmplen-str(i).count("1")#如果满足1递减的话
                    tmplen=str(i).count("1")
                    #print(tmplen)#测试用。满足条件
                    if f>=0:
                        continue
                    else:
                        flag.append(1)
                else:
                    flag.append(1)
        else:
            flag.append(1)
            #print(tmpym)#测试用
        #print(flag)#测试用,满足条件
        #print(zwys(IP1,ym))#测试用
        #2、算子网掩码并比较
        ymip1=zwys(IP1,ym)#算第一个子网掩码
        ymip2=zwys(IP2,ym)#算第二个子网掩码
        #print(ymip1,ymip2)#测试用
        if 1 not in flag:
            for i in range(4):
                if ymip1[i]==ymip2[i]:
                    flag.append(0)
                else:
                    flag.append(2)
        #print(flag)
        #最后就是一个flag判断的问题了
        if 1 in flag:
            print(1)
        elif 2 in flag:
            print(2)
        else:
            print(0)
            
            
    except:
        break