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=" ")

 

posted @ 2023-05-02 16:29  Aneverforget  阅读(265)  评论(0编辑  收藏  举报