Problem D: IP地址合法性和网络类别检查

116 篇文章 2 订阅
20 篇文章 0 订阅

Problem Description

IP地址就是给每个连接在互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围是唯一的32位的标识符。
“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号net-id,它标志主机(或路由器)所连接到的网络,第二个字段是主机号host-id,它标志该主机(或路由器)。
一个网络号在整个互联网范围内必须是唯一的,一台主机号在它前面的网络号所指明的网络范围内必须是唯一的,因此,一个IP地址在整个互联网范围内是唯一的。
IP地址分为五类,即A、B、C、D、E。其中A类、B类和C类地址为基本地址。规定如下表所示:

 

对主机或路由器来说,IP地址都是32位的二进制。为了提高IP地址的可读性,把32位的IP地址分成4个字节,每个字节用一个十进制数(0-255)来表示,而且在这些十进制数之间加一个点。叫做点分十进制记法。

现在给你若干个IP地址,编写程序判定这些IP地址的合法性,如果是合法的还需判断它的网络类别。

 

 Input Description

 输入数据有多组,每组一行,为一个点分十进制表示的IP地址。

 

 Output Description

 

对每组输入数据,如果不是合法的IP地址,输出"NO";是合法的IP地址,输出所属的网络类别。每组输入数据输出一行。

Sample Input

127.0.0.1
192.168.0.1
200.256.6.2

 Sample Output

A
C
NO

 Hint

 我的想法:

 我的代码:


# 定义一个集合用来装输入的多行数据


def add_data():
    data = []
    while True:
        try:
            a = input()
            # 读取一行信息
            if a == '':
                break
            # 如果a是空的则跳出循环
            a = a.split('.',4)
            # 将a按照.来切割为数组,数组中的元素为4个
            data.append(a)
            # 将数组装入集合中
        except:
            break

    return data


def date_panduan(e1, e2, e3):
    if 0 <= e1 <= 255:
        if 0 <= e2 <= 255:
            if 0 <= e3 <= 255:
                return True
    return False



def printf(date):
    for e1 in date:
        e = []
        for i in range(0, 4):
            e.append(int(e1[i]))

        if 0 <= e[0] <= 127:
            if date_panduan(e[1], e[2], e[3]):
                print("A")
                continue
        elif 128 <= e[0] <= 191:
            if date_panduan(e[1], e[2], e[3]):
                print("B")
                continue
        elif 192 <= e[0] <= 223:
            if date_panduan(e[1], e[2], e[3]):
                print("C")
                continue
        elif 224 <= e[0] <= 239:
            if date_panduan(e[1], e[2], e[3]):
                print("D")
                continue
        elif 240 <= e[0] <= 255:
            if date_panduan(e[1], e[2], e[3]):
                print("E")
                continue
        print("NO")



if __name__ == '__main__':
    date = add_data()
    printf(date)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小木苓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值