题解 | #识别有效的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))

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务