#Tips: #十进制数据转二进制:bin(a),a为十进制数,返回值为带有0b前缀的二进制数字字符串 #int函数做字符串转数字时参数不能为空 #有时候在Try...except...结构中,代码出错他不会给你抛出,debug时需要注意 #思路: #先特判是否不计数; #非不计数ip则再判断子网掩码是否正确,因为如果掩码不对直接就是错误ip了,不需要判断abcde和私有ip; #如果掩码正确则独立判断abcde和私网IP #检查ip函数1 def checkip1(ip): a=ip.split(".") for i in range(len(a)): if len(a[i])==0:#避免为空时直接使用int导致程序出错而退出Try return "W" else: a[i]=int(a[i]) #判断ABCDE类 if 1<=a[0]<=126 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255: return "A" elif 128<=a[0]<=191 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255: return "B" elif 192<=a[0]<=223 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255: return "C" elif 224<=a[0]<=239 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255: return "D" elif 240<=a[0]<=255 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255: return "E" else: return "W" #检查ip函数2 def checkip2(ip): a=ip.split(".") for i in range(len(a)): if len(a[i])==0: return False else: a[i]=int(a[i]) #判断私有ip p1= a[0]==10 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255 p2= a[0]==172 and 16<=a[1]<=31 and 0<=a[2]<=255 and 0<=a[3]<=255 p3= a[0]==192 and a[1]==168 and 0<=a[2]<=255 and 0<=a[3]<=255 if p1 or p2 or p3: return True #检查子网掩码函数 def checksub(sub): a=sub.split(".") #转数字之后转二进制 for i in range(len(a)): if len(a[i])==0: return False else: a[i]=int(a[i]) a[i]=bin(a[i])[2:] a[i]="0"*(8-len(a[i]))+a[i]#对有些不足8位的部分补全 b="".join(a) #判断子网掩码是不是前面全1后面全0 #思路:特判+使用“10”分割,判断前面是全1并且后面是全0 if len(b)==b.count("1") or len(b)==b.count("0"):#特判全1或者全0 return False elif b[0]=="1" and len(b[1:])==b.count("0"):#特判只有开头一个1 return True elif b[-1]=="0" and len(b[:-1])==b.count("1"):#特判只有末尾一个0 return True else: b1=b.split("10")#切割开之后的列表 b2=b1[0]#前半部分 b3=b1[1]#后半部分 if len(b1)==2 and len(b2)==b2.count("1") and len(b3)==b3.count("0"): return True else: return False Al=Bl=Cl=Dl=El=Wr=Pr=0#初始化各数量 while True: try: a=input().split("~") ip=a[0] sub=a[1] #特判不计数ip if ip[0]=="0" or ip[0:3]=="127": continue else: #判断子网掩码 if checksub(sub): #先判断私网IP if checkip2(ip): Pr+=1 #再判断是否为ABCDE类ip或错误ip if checkip1(ip)=="A": Al+=1 elif checkip1(ip)=="B": Bl+=1 elif checkip1(ip)=="C": Cl+=1 elif checkip1(ip)=="D": Dl+=1 elif checkip1(ip)=="E": El+=1 elif checkip1(ip)=="W": Wr+=1 else: Wr+=1 except: print(Al,Bl,Cl,Dl,El,Wr,Pr) break