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)