题解 | #识别有效的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')) # 结束位置
'''
搜狐畅游公司福利 1309人发布