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的主机号)。
输入网络前缀的长度,编写程序计算出对应的地址掩码和能够分配给主机的地址数。
为了更方便地进行路由选择,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()