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

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

ac代码
 1 def INTO(list):
 2     sum = 0;
 3     length = len(list)
 4     for i in range(length):
 5         sum+=list[i]*pow(2,i)
 6     return sum
 7 #计算地址掩码
 8 def caculate(a):
 9     x = int(a)
10     i = x // 8
11     n = x % 8
12     list = []
13     if x<1 or x>30:
14         return
15     if i==0:
16         for j in range(8):
17             if j<n:
18                 list.append(1)
19             else:
20                 list.append(0)
21         list.reverse()
22         ans = INTO(list)
23         num = pow(2,32-x)-2
24         print("%d.0.0.0 %d" %(ans,num))
25         return
26     if i==1:
27         for j in range(8):
28             if j < n:
29                 list.append(1)
30             else:
31                 list.append(0)
32         list.reverse()
33         ans = INTO(list)
34         num = pow(2,32-x)-2
35         print("255.%d.0.0 %d" %(ans,num))
36         return
37     if i==2:
38         for j in range(8):
39             if j < n:
40                 list.append(1)
41             else:
42                 list.append(0)
43         list.reverse()
44         ans = INTO(list)
45         num = pow(2,32-x)-2
46         print("255.255.%d.0 %d" %(ans,num))
47         return
48     if i==3:
49         for j in range(8):
50             if j < n:
51                 list.append(1)
52             else:
53                 list.append(0)
54         list.reverse()
55         ans = INTO(list)
56         num = pow(2,32-x)-2
57         print("255.255.255.%d %d" %(ans,num))
58         return
59 def func():
60     while True:
61         try:
62             a = input()
63             caculate(a)
64         except EOFError:
65             break
66 if __name__ == '__main__':
67     func()

 

 
posted @ 2023-04-24 16:33  hangsingplus  Views(32)  Comments(0Edit  收藏  举报