找個工作要會這個要會那個,真尼瑪難…
從頭開始吧,python以前沒學過但是很看好,以后用的人越來越多,畢竟太容易上手了,咱也不能落伍了,拿華為機試題練手吧!
題目:
請解析IP地址和對應的掩碼,進行分類識別。要求按照A/B/C/D/E類地址歸類,不合法的地址和掩碼單獨歸類。
所有的IP地址划分為 A,B,C,D,E五類
A類地址1.0.0.0~126.255.255.255;
B類地址128.0.0.0~191.255.255.255;
C類地址192.0.0.0~223.255.255.255;
D類地址224.0.0.0~239.255.255.255;
E類地址240.0.0.0~255.255.255.255
私網IP范圍是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子網掩碼為二進制下前面是連續的1,然后全是0。(例如:255.255.255.32就是一個非法的掩碼
輸入描述:
多行字符串。每行一個IP地址和掩碼,用~隔開。
輸出描述:
統計A、B、C、D、E、錯誤IP地址或錯誤掩碼、私有IP的個數,之間以空格隔開。
思路:
這道題網上方法很多,題目也比較簡單,我選取其中一種方法實現,
>>校驗Ip是否合規;
>>校驗掩碼是否合規;
>>Ip與掩碼均合規的情況下對Ip進行分類;
>>繼續判斷是否為私網Ip;
代碼:
#!/usr/bin/python # -*- coding: utf-8 -* import sys A=0 B=0 C=0 D=0 E=0 error=0 privateIp=0 lastcode=['254','252','248','240','224','192','128','0'] def CheckIp(ip): if len(ip) !=4 or '' in ip: return False else: for i in range(4): if int(ip[i]) < 0 or int(ip[i]) > 255: return False else: return True def CheckMask(mask): if len(mask)!=4: return False else: if mask[0]=='255': if mask[1]=='255': if mask[2]=='255': if mask[3] in lastcode: return True else: return False elif mask[2] in lastcode and mask[3]=='0': return True else: return False elif mask[1] in lastcode and mask[2]==mask[3]=='0': return True else: return False elif mask[0] in lastcode and mask[1]==mask[2]==mask[3]=='0': return True else: return False while True: Input= sys.stdin.readline().strip() if Input == '': break ipList=Input.split('~')[0] maskList=Input.split('~')[1] ip=ipList.split('.') mask=maskList.split('.') if CheckIp(ip) and CheckMask(mask): if 1<=int(ip[0])<=126: A+=1 if 128<=int(ip[0])<=191: B+=1 if 192<=int(ip[0])<=223: C+=1 if 224<=int(ip[0])<=239: D+=1 if 240<=int(ip[0])<=255: E+=1 if int(ip[0])==10 or (int(ip[0])==172 and 16<=int(ip[1])<=31) or (int(ip[0])==192 and int(ip[1])==168): privateIp+=1 else: error+=1 print(Input) print('{} {} {} {} {} {} {}'.format(A,B,C,D,E,privateIp,error))
總結:
新手上路,所以走了很多彎路,python函數、循環均沒有{}大括號進行組織,所以如果你是像我一樣習慣用c#或Java,那剛開始大概率我尼瑪了,因為代碼沒對齊可能得出的結果會截然不同,所以多注意下吧,其他沒什么了,反正感覺只要懂點英文都能寫了…