首页 > 试题广场 >

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

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

\hspace{15pt}我们定义五类 \sf{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}我们定义私有 \sf{IP} 地址:
\hspace{23pt}\bullet\,\texttt{
\hspace{23pt}\bullet\,\texttt{
\hspace{23pt}\bullet\,\texttt{

\hspace{15pt}我们定义合法的子网掩码:
\hspace{23pt}\bullet\,\sf{IP} 地址转换为二进制后,必须由若干个连续的 1 后跟若干个连续的 0 组成;
\hspace{23pt}\bullet\,例如,\texttt{ 是一个非法的子网掩码,因为它转换为二进制后为 \texttt{1.1.1.101} ,中间出现了 0 后又出现了 1
\hspace{23pt}\bullet\,注意,全为 1 或全为 0 的子网掩码也是非法的。

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

\hspace{15pt}特别地,我们还有以下提示:
\hspace{23pt}\bullet\,类似于 \texttt{\texttt{\sf{IP} 地址不属于上述输入的任意一类,也不属于不合法 \sf{IP} 地址;
\hspace{23pt}\bullet\,一个 \sf{IP} 地址既可以是私有 \sf{IP} 地址,也可以是五类 \sf{IP} 地址之一,计数时请分别计入。

输入描述:
\hspace{15pt}本题将会给出 1 \leqq T \leqq 1000 条地址信息,确切数字未知,您需要一直读入直到文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每条地址信息描述如下:

\hspace{15pt}在一行上先输入一个字符串,代表 \sf{IP} 地址;随后,在同一行输入一个字符串,代表子网掩码;使用 \texttt{ 分隔。


输出描述:
\hspace{15pt}在一行上输出七个整数,分别代表ABCDE类地址的数量、错误 \textsf{IP} 或错误子网掩码的数量、私有 \textsf{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}对于第一条地址信息,\texttt{ 是其 \sf{IP} 地址,\texttt{ 是其子网掩码;该条地址的子网掩码非法。
\hspace{15pt}对于第二条地址信息,\sf{IP} 地址和子网掩码均无误,且属于A类地址。
\hspace{15pt}对于第三条地址信息,\sf{IP} 地址和子网掩码均无误,且属于C类地址,同时属于私有 \sf{IP} 地址。
\hspace{15pt}对于第四条地址信息,\sf{IP} 地址非法。
示例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}对于第一、二条地址信息,均属于上方提示中提到的特殊 \sf{IP} 地址,不需要处理,直接跳过。
\hspace{15pt}特别地,第二条地址的子网掩码是非法的。但是因为该条为特殊 \sf{IP} 地址,此优先级更高,所以不进入统计。
头像 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 展开全文