题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682?tpId=37&tags=&title=&difficulty=0&judgeStatus=0&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37

'''
A, B, C, D, E, errors, privates一共7类,步骤如下:
1.判断是否为无效地址('0','127'开头)
2.判断格式有误的地址
3.判断掩码无效的地址
4.判断A, B, C, D, E类地址(处理合理地址)
5.判断私有地址(私有地址也为A, B, C类的合法地址,所以最后判断)
'''
import string
import sys

A, B, C, D, E, errors, privates = 0, 0, 0, 0, 0, 0, 0
def getBin(string):#合理地址转化为二进制方便比较
    return ''.join(map(lambda item:format(int(item),'08b'),string.split('.')))

for line in sys.stdin:
    ip,mask = line.replace('\n','').split("~")
	if ip.split('.')[0]=='0' or ip.split('.')[0]=='127':#判断ip是否一'0'或'127开头',是抛弃,不是继续
        continue
    if '' in ip.split('.') or '' in mask.split('.'):#判断是否残缺ip或掩码,是errors+1,不是继续
        errors+=1
        continue
	#剩余为格式无误的ip和掩码,可以转化为二进制数进行判断
    bin_ip=getBin(ip)
    bin_mask=getBin(mask)
    i_mask=0
    for i in range(len(bin_mask)-1,-1,-1):#找掩码分界线
        if bin_mask[i] !='0':
            i_mask=i
            break
    if bin_mask[:i_mask].count('0')>0 or bin_mask in (getBin('0.0.0.0'),getBin('255.255.255.255')) :#判断非法掩码,是errors+1,不是继续
        errors+=1
        continue
	#剩余为合法ip和掩码数据,进行A,B,C,D,E类分类
    if int(getBin('1.0.0.0'))<=int(bin_ip)<=int(getBin('126.255.255.255')):
        A+=1
    elif int(getBin('128.0.0.0'))<=int(bin_ip)<=int(getBin('191.255.255.255')):
        B+=1
    elif int(getBin('192.0.0.0'))<=int(bin_ip)<=int(getBin('223.255.255.255')):
        C+=1
    elif int(getBin('224.0.0.0'))<=int(bin_ip)<=int(getBin('239.255.255.255')):
        D+=1
    elif int(getBin('240.0.0.0'))<=int(bin_ip)<=int(getBin('255.255.255.255')):
        E+=1
	#判断是否为私域ip(私域地址属于A,B,C类地址,所以要最后判断)
    if int(getBin('10.0.0.0'))<=int(bin_ip)<=int(getBin('10.255.255.255')) or int(getBin('172.16.0.0'))<=int(bin_ip)<=int(getBin('172.31.255.255')) or int(getBin('192.168.0.0'))<=int(bin_ip)<=int(getBin('192.168.255.255')):
        privates+=1
print(A, B, C, D, E, errors, privates)
        

            
                                    





全部评论

相关推荐

头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
04-19 11:59
门头沟学院 Java
卷不动辣24314:挂,看来不该投这个部门的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务