《华为机试》刷题之HJ18 识别有效的IP地址和掩码并进行分类统计

一、题目

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的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.255.255.32就是一个非法的掩码)(注意二进制下全是1或者全是0均为非法子网掩码)

注意:

  1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  2. 私有IP地址和A,B,C,D,E类地址是不冲突的

输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

二、示例

在这里插入图片描述

三、代码

import sys
res = [0,0,0,0,0,0,0]
def fun_ip(ip): # 判断地址分类
    if 1 <= ip[0] <= 126:
        res[0] += 1
    if 128 <= ip[0] <= 191:
        res[1] += 1
    if 192 <= ip[0] <= 223:
        res[2] += 1
    if 224 <= ip[0] <= 239:
        res[3] += 1
    if 240 <= ip[0] <= 255:
        res[4] += 1
    if (ip[0] == 10) or (ip[0] == 172 and 16 <= ip[1] <= 32) or (ip[0] == 192 and ip[1] == 168):
        res[6] += 1
    return None

def fun_mask(mask): # 判断掩码合法性
    temp = (mask[0] << 24) + (mask[1] << 16) + (mask[2] << 8) + mask[3]
    if temp == 0 or (temp+1) == (1<<32) or '0' in bin(temp).strip('0'):
        return False
    return True

for IP in sys.stdin:
    ip, mask = IP.strip().split('~')
    list_ip = [int(x) for x in filter(None, ip.split('.'))]
    list_mask = [int(x) for x in filter(None, mask.split('.'))]
    if list_ip[0] == 0 or list_ip[0] == 127:
        continue
    elif len(list_ip) < 4 or len(list_mask) < 4:
        res[5] += 1 # 错误IP地址或错误掩码数+1
    elif fun_mask(list_mask) == True:
        fun_ip(list_ip)
    else:
        res[5] += 1 # 错误IP地址或错误掩码数+1

print(' '.join(map(str, res)))

四、算法说明

  • 定义列表res存储每一类地址的个数;
  • 定义函数fun_ip判断IP地址属于A,B,C,D,E,私网IP中的哪一类;
  • 定义函数fun_mask判断掩码地址是否合法:
    • 首先将掩码地址转化为32位数字,全是1或者全是0,为非法掩码,返回False
    • 然后将32位掩码转化为二进制,用strip函数去除头尾的'0'后,如果还有'0'在字符串中,为非法掩码,返回False
      注: 如果是合法的掩码,在连续的1中,是没有0的,例如:0b11111111111111101111111100000000
      0b11111111000000000000000000000000
      0b11111111111111111111111100000000
      第一个即为非法掩码。
  • 在主程序中,首先进行一波筛选,对于【0.*.*.*】和【127.*.*.*】的IP地址忽略不计,对IP地址掩码长度小于4的,计入错误类型。

胡萝卜

2022年3月18日14:26:19

我不知道将去向何方,但我已在路上!
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 !
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O_胡萝卜_O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值