Problem F: 计算地址掩码和地址数

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

Problem Description

CIDR使用斜线记法,即在IP地址的后面加上斜线“/”,然后写上网络前缀所占的位数。例如:128.14.35.7/24
为了更方便地进行路由选择,CIDR使用32位的地址掩码。地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。例如:128.14.35.7/24的地址掩码为11111111 11111111 11111111 00000000,使用点分十进制表示为255.255.255.0,主机位为8位,能够分配给主机的地址数为2^8-2=254(减2的原因是去掉全0和全1的主机号)。
输入网络前缀的长度,编写程序计算出对应的地址掩码和能够分配给主机的地址数。

 

 Input Description

 

 输入数据有多组,每组一行,为一个整数N(1<=N<=30),表示网络前缀的长度。

 Output Description

 对每组输入,在一行中输出对应的地址掩码(以点分十进制格式)和能够分配给主机的地址数,以1个空格分隔。

Sample Input

24
26

 Sample Output

255.255.255.0 254
255.255.255.192 62

 Hint

 我的想法:

 我的代码:

def init():
    # 构建列表用来存储数据
    data = []
    # 循环输入
    while (True):
        try:
            # 读入一个整数
            line = input()
            # 判断是不是空串
            if line == '':
                break
            # 将该整数装入列表
            if 1 <= int(line) <= 30:
                data.append(int(line))
        except:
            break
    return data


if __name__ == '__main__':
    data = init()
    # item是data中的也数据之一
    for item in data:
        # 定义a来存储32个位
        a = ''
        for i in range(32):
            if int(i) < item:
                a += '1'
            else:
                a += '0'

        # 将该字符串进行切片存储到列表中
        b = []
        b.append(a[0:8])
        b.append(a[8:16])
        b.append(a[16:24])
        b.append(a[24:32])

        # count是用来记录是否是第一个数
        count = 0

        for i in b:
            if count == 0:
                print(f"{int(i, 2)}", end='')
                count += 1
            else:
                print(f".{int(i,2)}", end='')

        print(" ", end='')
        # 能够室友的主机地址数为2的0的个数的次方  -2
        print(pow(2,32-item) - 2)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会编程的七七

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

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

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

打赏作者

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

抵扣说明:

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

余额充值