題目描述:
存在一種虛擬IPv4地址,由4小節(jié)組成,每節(jié)的范圍為0-255,以#號間隔,虛擬IPv4地址可以轉(zhuǎn)換為一個(gè)32位的整數(shù),例如:128#0#255#255,轉(zhuǎn)換為32位整數(shù)的結(jié)果為2147549183(0x8000FFFF)1#0#0#0,轉(zhuǎn)換為32位整數(shù)的結(jié)果為16777216(0x01000000)。
現(xiàn)以字符串形式給出一個(gè)虛擬IPv4地址,限制第1小節(jié)的范圍為1-128,即每一節(jié)范圍分別為
(1-128)#(0-255)#(0-255)#(0-255)
要求每個(gè)IPv4地址只能對應(yīng)到唯一的整數(shù)上。如果是非法IPv4,返回invalid IP
示例:
1#2#3
invalid 123
1#0#0#0
16777216
128#0#255#255
2147549183
解題思路:
ipv4由4小節(jié)組成,想要變成32位整數(shù),需要每一小節(jié)為8位的二進(jìn)制(這一塊可以用內(nèi)置函數(shù)bin來轉(zhuǎn)換,但是不足8位記得補(bǔ)0,補(bǔ)0的話記得要補(bǔ)在前面),最后4節(jié)合并在一起,這樣才能計(jì)算出32位的整數(shù)
"""
作者:長衣帶風(fēng)
時(shí)間:2023-6-27
ipV4地址轉(zhuǎn)化為32位整數(shù)"""
def ip_32(ip_list1):
'''
返回ip對應(yīng)的32位數(shù)
:param ip_list1: 列表格式,存放的是ip各個(gè)數(shù)值:['10', '0','0', '254']
:return: 32位的字符串
'''
str_b =""
for i in ip_list1:
# 轉(zhuǎn)換為二進(jìn)制
i1 =str(bin(int(i)))[2:]
while len(i1) <8:
i1 ='0' + i1# 也可以用zfill(8) 在左側(cè)填充0來補(bǔ)全
str_b += i1
# 總共32位,開始計(jì)算
sum1 =0
for num, jin enumerate(str_b[::-1]):
if int(j) ==1:
sum1 +=2**num
return sum1
if __name__ =='__main__':
while True:
a1 =input()# 輸入ipv4地址中間以 # 分割
# 確認(rèn)是否是合法的ipv4
ip_list1 = a1.split("#")
judge =True
if len(ip_list1) !=4:
judge =False
else:
for num, iin enumerate(ip_list1):
if num ==0:
if (int(i) >=1) & (int(i) <=128):
pass
else:
judge =False
break
else:
if (int(i) >=0) & (int(i) <=255):
pass
else:
judge =False
break
if judge ==False:
# 直接輸出不合規(guī)的ip
print(f"invalid {a1.replace('#','.')}")
else:
# 正常的ip
ip_num = ip_32(ip_list1)
print(ip_num)
效果展示:

image.png