题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

'''
注意整体判断顺序为:
1-判断ip是否合法;
2-ip合法了,子网合法不;
3-ip和子网都合法了,ABCDE类和私有ip不冲突,可以同时存在,所以先判断私有;
4-判断完私有后,开始分类五类有多少,非法有多少,私有多少
'''

#1、需要确定ip地址是否合法:四位,每一位都不能小于0,且不能大于255,也不能为空值或其他符号字母
def check_ip(ip):
    ip_list = ip.split(".")
    if len(ip_list) != 4:
        return False
    for i in ip_list:
        if not i.isdigit():
            return False
        if int(i) < 0 or int(i) > 255:
            return False
    return True

"""
2、需要判断子网掩码是否合法:
首先要满足ip地址合法的判定条件(调用函数1)
其次二进制下的形式均为1...10...0,不能存在101或者01 ,全是1或者全是0也是非法
"""
def check_ip_zi(zi_ip):
    if not check_ip(zi_ip):									#调用函数1
        return False
    zi_list = zi_ip.split(".")
    bin_list = [bin(int(k))[2:].zfill(8) for k in zi_list]
    bin_str = "".join(bin_list)
    if bin_str.find("0") == bin_str.rfind("1") + 1:			#第一个0索引号=最后一个1的索引号+1
        return True
    else:
        return False
"""
3、需要判断ip地址是否为私有:
首位为10、首位为172且第二位大于等于16小于等于31、首位为192且第二位为168
"""
def check_ip_siyou(ip):
    ip_list = ip.split(".")
    if ip_list[0] == "10":
        return True
    if ip_list[0] == "172" and 16 <= int(ip_list[1]) <= 31:
        return True
    if ip_list[0] == "192" and ip_list[1] == "168":
        return True
# 4、主程序,分类判断 A、B、C、D、E、非法ip或子网、私有ip。首位为0或127不属于任何类别,也合法,continue他
A = 0
B = 0
C = 0
D = 0
E = 0
feifa = 0
siyou = 0
while 1:
    try:
        in_ip = input()
        ip = in_ip.split("~")[0]
        zi_ip = in_ip.split("~")[1]
        if check_ip(ip):
            first = ip.split(".")[0]
            if first == "0" or first == "127":
                continue
            if check_ip_zi(zi_ip):
                if check_ip_siyou(ip):
                    siyou += 1
                if 1 <= int(first) <= 126:
                    A += 1
                elif 128 <= int(first) <= 191:
                    B += 1
                elif 192 <= int(first) <= 223:
                    C += 1
                elif 224 <= int(first) <= 239:
                    D += 1
                elif 240 <= int(first) <= 255:
                    E += 1
            else:
                feifa += 1
        else:
            feifa += 1
    except:
        break
print(A, end=" ")
print(B, end=" ")
print(C, end=" ")
print(D, end=" ")
print(E, end=" ")
print(feifa, end=" ")
print(siyou)

全部评论

相关推荐

笑着秋招😊:我一直认为努力有回报是一件很幸福很幸福的事情,恭喜你
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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