首页 > 其他分享 >HJ18 识别有效的IP地址和掩码并进行分类统计

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

时间:2024-04-07 19:11:06浏览次数:27  
标签:0.0 HJ18 255.255 vec IP地址 掩码 first

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682?tpId=37&tqId=21241&rp=1&ru=/exam/company&qru=/exam/company&sourceUrl=%2Fexam%2Fcompany&difficulty=undefined&judgeStatus=undefined&tags=&title=

题目要点:

所有的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。

输出:统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数

一些需要注意的细节
类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时可以忽略
私有IP地址和A,B,C,D,E类地址是不冲突的,也就是说需要同时+1
如果子网掩码是非法的,则不再需要查看IP地址
全零【0.0.0.0】或者全一【255.255.255.255】的子网掩码也是非法的

思路

  1. 按行读取输入,根据字符‘~’ 将IP地址与子网掩码分开
  2. 查看子网掩码是否合法。
  • 合法,则继续检查IP地址
  • 非法,则相应统计项+1,继续下一行的读入
  1. 查看IP地址是否合法
  • 合法,查看IP地址属于哪一类,是否是私有ip地址;相应统计项+1
  • 非法,相应统计项+1

具体实现

  1. 判断IP地址是否合法,如果满足下列条件之一即为非法地址
  • 数字段数不为4
  • 存在空段,即【192..1.0】这种
  • 某个段的数字大于255
  1. 判断子网掩码是否合法,如果满足下列条件之一即为非法掩码
  • 不是一个合格的IP地址
  • 在二进制下,不满足前面连续是1,然后全是0
  • 在二进制下,全为0或全为1
  1. 如何判断一个掩码地址是不是满足前面连续是1,然后全是0?
  • 将掩码地址转换为32位无符号整型,假设这个数为b。如果此时b为0,则为非法掩码
  • 将b按位取反后+1。如果此时b为1,则b原来是二进制全1,非法掩码
  • 如果b和b-1做按位与运算后为0,则说明是合法掩码,否则为非法掩码

代码


#include <iostream>
#include <vector>
#include <string>
#include<sstream>
using namespace std;

bool judge_ip(string ip){
    //不是合法地址:1. 不为四段 2.有空段 3.某段的数字大于255
    istringstream is(ip);
    string s;
    vector<int> vec;
    int j = 0;
    while(getline(is, s,'.')){
        if(++j > 4 || s.empty() || stoi(s) > 255)
            return false;
    }
    return j == 4;
}

bool judge_mask(string mask){
    istringstream is(mask);
    string s;
    vector<int> vec;
    unsigned int j = 0;
    while(getline(is, s,'.')){
        j = (j << 8) + stoi(s);
    }
    if(!j) return false;
    j = ~j + 1;
    if(j == 1) return false;
    if((j & (j-1)) == 0) return true;
    return false;
}

bool isprivate(string ip){
    istringstream is(ip);
    string tmp;
    vector<int> v;
    while(getline(is,tmp,'.')){
        v.push_back(stoi(tmp));
    }
    if(v[0] == 10) return true;
    if(v[0] == 172 && (v[1] >= 16 && v[1] <= 31)) return true;
    if(v[0] == 192 && v[1] == 168) return true;
    return false;
}

int main() {
    string tmp;
    int a = 0,b = 0,c = 0,d = 0,e = 0,err = 0,p = 0;
    while(cin >> tmp){
        istringstream is(tmp);
        string s;
        vector<string> vec;
        while(getline(is,s,'~')) vec.push_back(s);
        int first = stoi(vec[0].substr(0,vec[0].find_first_of('.')));
        if(first == 0 || first == 127) continue;
        else if(!judge_ip(vec[1]) || !judge_mask(vec[1])) err++;
        else{
            if(!judge_ip(vec[0])) err++;
            else{
                if(isprivate(vec[0])) p++;
                if(first > 0 && first <127) a++;
                else if(first > 127 && first <192) b++;
                else if(first > 191 && first <224) c++;
                else if(first > 223 && first <240) d++;
                else if(first > 239 && first <256) e++;
            }
        }
    }
    cout << a << " " << b << " " << c << " " << d << " " << e << " " << err << " " << p << endl;
    return 0;
}
// 64 位输出请用 printf("%lld")

标签:0.0,HJ18,255.255,vec,IP地址,掩码,first
From: https://www.cnblogs.com/lihaoxiang/p/18119719

相关文章

  • 在Linux中,什么是网络接口配置?如何配置IP地址?
    在Linux系统中,网络接口配置是指设置和调整系统网络接口的参数,以便系统能够正确地连接到网络并进行通信。网络接口可以是物理的,如以太网端口,也可以是虚拟的,如虚拟机的虚拟网络接口或VPN连接。1.网络接口配置的作用网络连接:配置网络接口使得Linux系统能够连接到局域网(LAN)或广域......
  • centos7如何更改ip地址
    1.查看网络设置文件输入ls/etc/sysconfig/network-scripts/查看网络设置文件,每台机的文件名都不一定相同,但是基本都是ifcfg开头。2.修改网络设置文件首先输入ifconfig查看需要更改的网卡确定好需要更改的网卡后使用vim修改相关文件,将下面指令的ens192替换成自己的vim/etc......
  • 如何隐藏我的IP?5种隐藏IP地址的方法
    对于管理多个账户的跨境电商或者外贸企业来说,隐藏IP地址已成为保护隐私安全的重要一步。IP地址是每台连接到互联网的设备的唯一标识符,它可以被用于追踪用户的在线活动和位置,但IP地址也可能暴露我们的位置和身份信息,本文将为大家介绍一些隐藏IP的有效方法,帮助你在互联网上隐藏身......
  • 了解IP地址的基本概念和修改步骤
    在数字化时代,IP地址作为网络设备的唯一标识,其重要性不言而喻。无论是为了提升网络性能,还是出于隐私保护的需求,修改IP地址都是网络使用者可能遇到的操作。虎观代理将详细介绍如何修改IP地址,并探讨在修改过程中需要注意的事项。一、了解IP地址的基本概念在开始修改IP地址之前,......
  • PowerShell 中,你可以使用 Get-NetRoute 命令来查看本地系统的路由表。这个命令将显示
    PowerShell中,你可以使用Get-NetRoute命令来查看本地系统的路由表。这个命令将显示系统中的所有路由条目,包括目的网络、子网掩码、网关、接口索引等信息。以下是使用Get-NetRoute命令的示例:powershellCopyCodeGet-NetRoute这将列出系统中的所有路由条目。ifIndexDes......
  • 判断ip地址是否合法(美团2024届秋招笔试第三场编程真题)
    核心思想大模拟-。-,还是不够细心,面向样例编程,一路错过去的。写得太丑了凑合看吧。代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);Scannerscanner=newScanner(Syste......
  • 广播地址和子网掩码之间有什么区别?子网掩码和ip冲突问题
    广播地址和子网掩码在计算机网络中各自扮演不同的角色,它们之间有着明显的区别。【广播地址和子网掩码的区别】广播地址是一个特殊的IP地址,专门用于向网络中所有工作站发送信息。当设备发送数据包到广播地址时,所有连接到同一个网络的设备都会接收到该数据包。广播地址的存在使......
  • 网络编程------网络与IP地址
    IP地址        IP地址的基本概念    1.IP地址是Internet中主机的标识    2.Internet中的主机要与别的设备通信必须具有一个IP地址    3.IP地址为32位(IPV4)或者是128位(IPV6)        IP地址的表示形式            ......
  • 代理IP地址是什么(代理服务器)
    代理IP地址就是一种能够保护用户IP地址,增强网络连接安全性的服务。而在这些服务中,免费代理IP地址更是为用户提供了一种智能时代连接时代。免费代理IP地址是一种无需付费即可使用的代理IP服务。与付费代理IP地址相比,免费代理IP地址虽然在稳定性和速度上可能存在一些管理,但其仍......
  • [docker] 浅谈Docker:网络模式及从容器内部访问宿主机的IP地址
    0序本文系转载参考文献,属于非原创的笔记类博文。最新结论:从Docker容器内部访问宿主的IP地址的几种方法,推荐基于Bridge模式+--link访问别的服务+172.16.0.1(访问宿主机)。1Docker的网络模式docker是比较流行的容器技术,docker镜像方便程序员对应用统一的要求,打包部......