题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import sys
a_cnt,b_cnt,c_cnt,d_cnt,e_cnt,er_cnt,pr_cnt = 0,0,0,0,0,0,0 #初始化各类地址数量
def bin8(x): #定义一个2进制补齐8位的函数(地址和掩码必须补齐8位数否则判断会出错误)
return '{:0>8s}'.format(bin(int(x))[2:])
def mask_check(maskn): #定义掩码查错规则,正确为1,错误为0,传入的maskn为拆分后的列表
maskn_bin8 = "".join([bin8(x) for x in maskn]) #把maskn各数值转换为8位二进制后拼接
if ('0' not in maskn_bin8) or (int(maskn_bin8) == 0) or ('01' in maskn_bin8):
#拼接后字符串全为'1'或全为'0'或存在'01'均判定掩码非法,否则判定合法。
mr = 0
else:
mr = 1
return mr
while True:
try:
flag = 0 #初始化状态标识为0
ip,mask = input().split("~") #获取输入,拆分为地址和掩码的整体字符串
ipn = list(map(lambda x:'999' if len(x)==0 else x,ip.split("."))) #拆分地址
maskn = mask.split(".") #拆分掩码
if ipn[0] in ['0','127']: #如果地址开头为'0'或'127'则忽略此条记录,白名单
continue
if mask_check(maskn) == 0: #首先检查掩码是否合法,若非法则记录后跳过此次循环
er_cnt += 1
flag = -1
continue
if flag == 0: #循环若继续,则说明掩码均合法,以下则判断地址是否私有。若归类则改变flag值
if (ipn[0] == '10') and (0 <= int(ipn[1]) <= 255) and (0 <= int(ipn[2]) <= 255) and (0 <= int(ipn[3]) <= 255): #'10'开头的私有地址
pr_cnt += 1
flag = 1
elif (ipn[0] == '172') and (16 <= int(ipn[1]) <= 31) and (0 <= int(ipn[2]) <= 255) and (0 <= int(ipn[3]) <= 255): #'172'开头的私有地址
pr_cnt += 1
flag = 1
elif (ipn[0] == '192') and (ipn[1] == '168') and (0 <= int(ipn[2]) <= 255) and (0 <= int(ipn[3]) <= 255): #'192'开头的私有地址
pr_cnt += 1
flag = 1
if (0 <= int(ipn[1]) <= 255) and (0 <= int(ipn[2]) <= 255) and (0 <= int(ipn[3]) <= 255): #判断地址类别,地址类别和上一步是否私有并列,都需要判断。若归类则改变flag值
if (1 <= int(ipn[0]) <= 126): #A类地址
a_cnt += 1
flag = 1
elif (128 <= int(ipn[0]) <= 191): #B类地址
b_cnt += 1
flag = 1
elif (192 <= int(ipn[0]) <= 223): #C类地址
c_cnt += 1
flag = 1
elif (224 <= int(ipn[0]) <= 239): #D类地址
d_cnt += 1
flag = 1
elif (240 <= int(ipn[0]) <= 255): #E类地址
e_cnt += 1
flag = 1
if (flag==0): #如果flag==0则说明上边的私有和合法地址均未判定。
#排除掉'0','127'开头的白名单、非法掩码、私有地址、A-E类合法地址后,如果还未归类则只能为其他错误
er_cnt += 1
except:
break
res = [str(a_cnt),str(b_cnt),str(c_cnt),str(d_cnt),str(e_cnt),str(er_cnt),str(pr_cnt)]
print(" ".join(res))
查看3道真题和解析