首页 > 试题广场 >

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

[编程题]识别有效的IP地址和掩码并进行分类统计
  • 热度指数:375914 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}在本题中,我们需要处理地址信息,其由 IP 地址和子网掩码组成,这两者均形如 \texttt{,由四段数字组成(每一个 \texttt{`*'} 表示一个数字),每一段的数字均为 0255 之间的一个整数,每段数字之间以点分隔。

\hspace{15pt}我们定义五类 IP 地址:
\hspace{23pt}\bullet\,A 类:\texttt{
\hspace{23pt}\bullet\,B 类:\texttt{
\hspace{23pt}\bullet\,C 类:\texttt{
\hspace{23pt}\bullet\,D 类:\texttt{
\hspace{23pt}\bullet\,E 类:\texttt{
\hspace{15pt}我们定义私有 IP 地址:
\hspace{23pt}\bullet\,\texttt{
\hspace{23pt}\bullet\,\texttt{
\hspace{23pt}\bullet\,\texttt{

\hspace{15pt}我们定义合法的子网掩码为:将掩码的每一段数字依次转换为八位长度的二进制字符串并进行拼接,这个字符串必须由若干个连续的 1 后跟若干个连续的 0 组成,才视为子网掩码合法。例如,掩码 \texttt{ 转换拼接得到字符串 \texttt{11111111 11111110 11111111 00000000},显然不合法;掩码 \texttt{ 转换拼接得到字符串 \texttt{11111111 11111111 11111111 11111000},合法。注意,全为 1 或全为 0 的掩码也视为非法。
\hspace{15pt}我们定义错误的 IP 地址和错误的子网掩码为不符合上述定义的 IP 地址和子网掩码。例如,格式错误、数字超出范围等等。

\hspace{15pt}现在,你需要分类统计 A、B、C、D、E 类地址的数量、错误 IP 或错误子网掩码的数量、私有 IP 的数量。

\hspace{15pt}特别地:
\hspace{23pt}\bullet\,类似 \texttt{\texttt{ 的 IP 地址不计入任何类别,也不计入非法统计,直接跳过;
\hspace{23pt}\bullet\,一个 IP 既可计入私有 IP,也可计入五类地址之一,二者分别累计。

输入描述:
\hspace{15pt}本题将会给出 1 \leqq T \leqq 1000 条地址信息,确切数字未知,您需要一直读取至文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每条地址信息描述如下:
\hspace{15pt}每行输入一个 \texttt{ 形式的 IP 地址和一个 \texttt{ 形式的子网掩码,中间用波浪线(\sim)分隔。保证 \texttt{`*'} 要么为空,要么是一个 0255 间的整数。


输出描述:
\hspace{15pt}在一行上输出七个整数,分别代表 A 类地址数、B 类地址数、C 类地址数、D 类地址数、E 类地址数、错误 IP 或错误子网掩码数、私有 IP 数。
示例1

输入

10.70.44.68~1.1.1.5
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0

输出

1 0 1 0 0 2 1

说明

\hspace{15pt}在这个样例中: 
\hspace{23pt}\bullet\,第一条地址信息:掩码非法;
\hspace{23pt}\bullet\,第二条地址信息:IP 格式和掩码均合法,属于 A 类;
\hspace{23pt}\bullet\,第三条地址信息:IP 格式和掩码均合法,属于 C 类私有地址;
\hspace{23pt}\bullet\,第四条地址信息:IP 格式非法。
\hspace{15pt}统计得到 1 个 A 类,0 个 B 类,1 个 C 类,0 个 D 类,0 个 E 类,2 个错误条目,1 个私有地址。
示例2

输入

0.201.56.50~255.255.255.0
127.201.56.50~255.255.111.255

输出

0 0 0 0 0 0 0

说明

\hspace{15pt}在这个样例中,两条地址信息均属于上方提示中提到的特殊 IP 地址,不需要处理,直接跳过。特别需要注意地,第二条地址的子网掩码是非法的。但是因为该条为特殊 IP 地址,此优先级更高,所以不进入统计。

备注:
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-30 更新题面。
2. 2024-12-16 更新题面。
头像 milomusiala
发表于 2020-06-16 08:42:04
题目要点: 所有的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 展开全文
头像 f(x)=n^2
发表于 2021-09-29 01:01:01
ipClass2num = { 'A':0, 'B':0, 'C':0, 'D':0, 'E':0, 'ERROR':0, 'PRIVATE':0, } # 私有IP地址和A,B,C,D,E类地址是不冲突的,也就是说需要同时+1 def che 展开全文
头像 牛客875694424号
发表于 2021-11-07 12:22:28
结合前面几位大佬的题解,整出一个Java版.这里有个大坑,若是ip是0或者127开头的直接忽略,即使子网掩码是非法的,也不能将此算到error里去。 具体实现 查看ip第一段是否为“0”或“127”,若是忽略; 判断子网掩码是否合法,如果满足下列条件之一即为非法掩码 数字段数不为4 在二进制下 展开全文
头像 不会做题的小菜鸡
发表于 2021-11-02 20:13:26
题目分析 题目给出了若干个IP地址和子网掩码的字符串 我们要根据给出的信息对这些IP和掩码进行划分工作,统计类型 一共要划分和统计的类型有7种,分别是A、B、C、D、E类IP地址的数量,错误IP或错误掩码的数量、私有IP的数量 这是一个处理字符串的问题,思路其实比较简单,一点点抠细节处理清 展开全文
头像 一只熊熊
发表于 2020-11-17 19:14:05
子网掩码转换为二进制后,前面x位都为1,后面x为都为0。通常的子网掩码校验方法基本都是循环校验,实现比较复杂。今天向大家介绍一个简单的校验子网掩码的方法。假设子网掩码其中一段为mask=111100001.对子网掩码取反(或者与0xFFFFFFFF异或),取反后子网掩码为000011112.取反后的 展开全文
头像 摸鱼学大师
发表于 2021-10-10 17:04:01
题目的主要信息: 给出多行字符串,每行都是"IP地址~掩码"的形式,统计A类地址、B类地址、C类地址、D类地址、E类地址、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开 IP地址类型如下: A类地址1.0.0.0~126.255.255.255; B类地址128.0.0.0~191. 展开全文
头像 刷城
发表于 2020-03-30 18:15:53
平时就没咋练习这些题,对ip啊,子网掩码就知道个ip协议4中配置,看到华为的这道题,说实话,题都没咋看懂。不过搞了3天后,终于搞清楚了,下面分享一些我的思路和遇到的一些坑 坑一 统计错误IP地址或错误掩码的数目 一开始我想的是,统计每一个错误的ip地址和错误掩码,举个例子,0.0.10.1~255. 展开全文
头像 陶陶2021
发表于 2021-09-28 22:40:07
1、如果是0...* 或 127...* 跳过2、如果掩码错误,直接错误+1,扫描下一个3、如果掩码正确,判断ip,如果ip错误,错误+14、如果ip正确,判断ip类型5、如果是A类型, A++ 如果是私人ip,privateIp++如果是B类型, B++ 如果是私人ip,privateIp++如 展开全文
头像 徐可可18739776523
发表于 2022-05-05 20:17:24
自己写的和其他人写的比较了下,我的代码应该更简单易懂一些,所以把自己的答案放了出来。这里只放了答案,如果需要更多的说明,可以参考【华为机试Python3题解】HJ18识别有效的IP地址和掩码并进行分类统计 import re A, B, C, D, E, errs, privates = 0, 0 展开全文
头像 Python_zhang
发表于 2022-01-08 23:01:27
#include <stdio.h> #include <string.h> #include <stdlib.h> // 多行注释 ctrl+/ /*char *token token = strtok(str, "分割符"); while( token 展开全文