题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
''' 所有的IP地址划分为 A,B,C,D,E五类 A类地址从1.0.0.0到126.255.255.255; B类地址从128.0.0.0到191.255.255.255; C类地址从192.0.0.0到223.255.255.255; D类地址从224.0.0.0到239.255.255.255; E类地址从240.0.0.0到255.255.255.255 私网IP范围是: 从10.0.0.0到10.255.255.255 从172.16.0.0到172.31.255.255 从192.168.0.0到192.168.255.255 子网掩码为二进制下前面是连续的1,然后全是0。 意为:前面都是255,后面都是0 ''' # ip、mask 是否均合法 def iflegal_ip(ip): # 列表形式 if len(ip)!=4: return False else: for i in ip: if ( i.isdigit()==0 or i=='' # i 是空值 or int(i)>255 or int(i)<0 or (i[0]==0 and len(i)>1) ): return False break else: return True def iflegal_mask(mask): if not iflegal_ip(mask): # 不满足合法ip的要求,mask必定不合法 return False #if len(mask)!=4: #return False if mask==[0,0,0,0] or mask==[255,255,255,255]: return False #legal_mask=[[255,0,0,0],[255,255,0,0],[255,255,255,0]] # 子网掩码不仅有上面3个,需要判断1和0交接的位置(1的结束位置、0的起始位置) mask_bin=[] # 存放二进制掩码 for i in mask: j=bin(int(i)) j=j[2:] #转二进制后,前俩位置是0b mask_bin.append(j.zfill(8)) # .zfill:返回指定长度的字符串,原字符串右对齐,前面填充0 full_mask=''.join(mask_bin) full1_find=full_mask.rfind('1') # 1的结束位置 full0_find=full_mask.find('0') # 0的起始位置 if full1_find+1==full0_find: return True else: return False a=0 b=0 c=0 d=0 e=0 wrong=0 personal=0 while 1: try: s=input().split('~') ip,mask=s[0].split('.'),s[1].split('.') #print(ip,iflegal_ip(ip),mask,iflegal_mask(mask)) if int(ip[0])==0 or int(ip[0])==127: continue if iflegal_ip(ip) and iflegal_mask(mask): # 若ip或mask非法 if 1<=int(ip[0])<=126: a += 1 if int(ip[0])==10: personal += 1 elif 128<=int(ip[0])<=191: b += 1 if int(ip[0])==172 and 16<=int(ip[1])<=31: personal += 1 elif 192<=int(ip[0])<=223: c += 1 if int(ip[0])==192 and int(ip[1])==168: personal += 1 elif 224<=int(ip[0])<=239: d += 1 elif 240<=int(ip[0])<=255: e += 1 elif int(ip[0])==0 or int(ip[0])==127: # 0 127 忽略 continue else: wrong += 1 except: break print(a,end=' ') print(b,end=' ') print(c,end=' ') print(d,end=' ') print(e,end=' ') print(wrong,end=' ') print(personal,end=' ') ''' s='11000111111000001' print(s.find('1'),s.find('0')) #起始位置 print(s.rfind('1'),s.rfind('0')) # 结束位置 '''