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

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

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

import sys

def to_bin_8(in_dec):
    out_bin = str(in_dec % 2)
    for i in range(7):
        in_dec = int(in_dec / 2)
        out_bin = str(in_dec % 2) + out_bin
    return out_bin

def to_dec(in_bin):
    i = 1
    out_dec = 0
    for j in range(len(in_bin) - 1, -1, -1):
        out_dec += int(in_bin[j]) * i
        i *= 2
    return out_dec

def addr_to_num(in_addr):
    bin_addr = ""
    for part in in_addr.split("."):
        bin_addr += to_bin_8(int(part))
    return to_dec(bin_addr)

a = 0
b = 0
c = 0
d = 0
e = 0
invalid = 0
private = 0

private_bounds = [
    (addr_to_num("10.0.0.0"), addr_to_num("10.255.255.255")),
    (addr_to_num("172.16.0.0"), addr_to_num("172.31.255.255")),
    (addr_to_num("192.168.0.0"), addr_to_num("192.168.255.255"))
]
a_bounds = (addr_to_num("1.0.0.0"), addr_to_num("126.255.255.255"))
b_bounds = (addr_to_num("128.0.0.0"), addr_to_num("191.255.255.255"))
c_bounds = (addr_to_num("192.0.0.0"), addr_to_num("223.255.255.255"))
d_bounds = (addr_to_num("224.0.0.0"), addr_to_num("239.255.255.255"))
e_bounds = (addr_to_num("240.0.0.0"), addr_to_num("255.255.255.255"))
for line in sys.stdin:
    addr, mask = line.split("~")
    try:
        pass_this = False
        if addr.split(".")[0] == "0" or addr.split(".")[0] == "127":
            continue

        bin_mask = ""
        for part in mask.split("."):
            bin_mask += to_bin_8(int(part))
        if bin_mask[0] == "0" or bin_mask[-1] == "1":
            invalid += 1
            continue
        allow_one = True
        for i in bin_mask:
            if i == "0" and allow_one:
                allow_one = False
            if i == "1" and not allow_one:
                pass_this = True
                break
        if pass_this:
            invalid += 1
            continue

        num_mask = to_dec(bin_mask)
        num_addr = addr_to_num(addr)
        masked_addr = num_addr & num_mask
        if (masked_addr >= private_bounds[0][0] and masked_addr <= private_bounds[0][1]) \
            or (masked_addr >= private_bounds[1][0] and masked_addr <= private_bounds[1][1]) \
            or (masked_addr >= private_bounds[2][0] and masked_addr <= private_bounds[2][1]):
            private += 1
        
        if masked_addr >= a_bounds[0] and masked_addr <= a_bounds[1]:
            a += 1
        elif masked_addr >= b_bounds[0] and masked_addr <= b_bounds[1]:
            b += 1
        elif masked_addr >= c_bounds[0] and masked_addr <= c_bounds[1]:
            c += 1
        elif masked_addr >= d_bounds[0] and masked_addr <= d_bounds[1]:
            d += 1
        elif masked_addr >= e_bounds[0] and masked_addr <= e_bounds[1]:
            e += 1

        
        
    except:
        invalid += 1
        continue

print("{} {} {} {} {} {} {}".format(a, b, c, d, e, invalid, private))
    



全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务