HJ18 识别有效的IP地址和掩码并进行分类统计
思路:
程序实现不难,困难的是看懂题目。需要右一点IP地址和子网掩码的基本知识。
困难点1:255.255.255.32就是一个非法的掩码。32的二进制0b100000,不足8位,需要补全为00100000,因此1前面有‘0’是非法掩码。
困难2:当成对的子网掩码或IP地址为非法时,计算为一个错误,并不再对IP地址的类别计数。
1 #255.255.255.32就是一个非法的掩码. 2 #虽然32的二进制位为0b100000,但补充为8位后00100000,1前面有0,因此为不合法IP地址 3 def ipc(m): 4 a,b,c,d,e,f,p=0,0,0,0,0,0,0 5 if len(m)>4 or len(m)<=0: 6 f=1 7 if not (255>=m[0]>=0 and 255>=m[1]>=0 and 255>=m[2]>=0 and 255>=m[2]>=0 ): 8 f=1 9 if 126>=m[0]>=1: 10 a=1 11 if m[0]==10: 12 p=1 13 elif 191>=m[0]>=128: 14 b=1 15 if m[0]==172 and 31>m[1]>=16 : 16 p=1 17 elif 223>=m[0]>=192: 18 c=1 19 if m[0]==192 and m[1]==168 : 20 p=1 21 elif 239>=m[0]>=224: 22 d=1 23 elif 255>=m[0]>=240: 24 e=1 25 return [a,b,c,d,e,f,p] 26 def maskc(n): 27 a,b,c,d,e,f,p=0,0,0,0,0,0,0 28 if len(n)>4 or len(n)<=0: 29 f=1 30 if not (255>=n[0]>=0 and 255>=n[1]>=0 and 255>=n[2]>=0 and 255>=n[2]>=0 ): 31 f=1 32 s='' 33 for i in range(4): 34 temp=str(bin(n[i]))[2:] 35 if len(temp)<8: 36 temp=(8-len(temp))*'0'+temp #对转换为二进制不足8位数的二进制,在前面补充”0” 37 s=s+temp 38 if "0" not in s or "1" not in s: 39 f=1 40 while s[-1]=='0': 41 s=s[:-1] 42 if "0" in s: 43 f=1 44 return [a,b,c,d,e,f,p] 45 g=[0,0,0,0,0,0,0] 46 while True: 47 try: 48 list1=input() 49 line = list1.strip().split("~") 50 m=list(map(int,line[0].split("."))) 51 n=list(map(int,line[1].split("."))) 52 if m[0]==0 or m[0]==127: 53 pass#该IP地址不属于任意一类 54 else: 55 g1=maskc(n) 56 g2=ipc(m) 57 #对不合法IP地址或掩码再次处理,避免重复计数,包括去除重复计数IP地址类别。 58 if g1[5]==1 or g2[5]==1:#避免不合法IP和掩码重复计数,把任意一个置为0 59 g1=[0,0,0,0,0,0,0] 60 g2=[0,0,0,0,0,1,0] 61 #print(g1,g2,"after") 62 for i in range(7): 63 g[i]=g[i]+g1[i]+g2[i] 64 #print(g[5]) 65 except: 66 break 67 for i in g: 68 print(i,end=" ")