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

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

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

这个题目纯是没事找事,把ip不属于任何一类,但是掩码错误混为一谈了,得去分开才可以
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

unsigned long A1 = 1 << 24;
unsigned long A2 = (126 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long B1 = 128 << 24;
unsigned long B2 = (191 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long C1 = 192 << 24;
unsigned long C2 = (223 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long D1 = 224 << 24;
unsigned long D2 = (239 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long E1 = 240 << 24;
unsigned long E2 = (255 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long S1 = 10 << 24;
unsigned long S2 = (10 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long S3 = (172 << 24) | (16 << 16);
unsigned long S4 = (172 << 24) | (31 << 16) | (255 << 8) | (255 << 0);
unsigned long S5 = (192 << 24) | (168 << 16);
unsigned long S6 = (192 << 24) | (168 << 16) | (255 << 8) | (255 << 0);
unsigned long N1 = 0;
unsigned long N2 = (0 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
unsigned long N3 = 127 << 24;
unsigned long N4 = (127 << 24) | (255 << 16) | (255 << 8) | (255 << 0);
//写一个函数判断子网掩码是否合格
vector<int> tonum(string ss)
{
    vector<int> num;
    for (int i = 0;i < ss.size();i++)
    {
        string s = "";
        while (ss[i] != '.')
        {
            s += ss[i];
            if (i == ss.size() - 1) break;
            i++;
        }
        if (s.size() != 0) num.push_back(stoi(s));
    }
    return num;
}
bool subwebcode(string ss)
{
    if (ss.size() < 7) return false;
    if (ss[0] == '.' || ss[ss.size() - 1] == '.') return false;
    vector<int> num = tonum(ss);
    if (num.size() != 4) return false;
    unsigned long tt = (num[0] << 24) | (num[1] << 16) | (num[2] << 8) | (num[3] << 0);
    if (tt == 0)return false;
    tt = ~tt;
    tt++;
    if (tt == 1) return false;
    if (tt & (tt - 1)) return false;
    return true;
}

//还得写一个函数看看是哪一类的ip

char checkip(string ss)
{
    if (ss.size() < 7) return 'N';
    if (ss[0] == '.' || ss[ss.size() - 1] == '.') return 'N';
    vector<int> num = tonum(ss);
    if (num.size() != 4) return 'N';
    unsigned long tt = (num[0] << 24) | (num[1] << 16) | (num[2] << 8) | (num[3] << 0);
    if ((tt >= S1 && tt <= S2))return 'Y';
    if ((tt >= S3 && tt <= S4))return 'U';
    if ((tt >= S5 && tt <= S6)) return 'M';
    if ((tt >= N1 && tt <= N2 ) || (tt >= N3 && tt <= N4))return 'W';
    if (tt >= A1 && tt <= A2)return 'A';
    if (tt >= B1 && tt <= B2) return 'B';
    if (tt >= C1 && tt <= C2)return 'C';
    if (tt >= D1 && tt <= D2)return 'D';
    if (tt >= E1 && tt <= E2)return 'E';

    return 'N';

}

int main() {
    vector<int> result(7, 0);
    string sss;
    while (getline(cin, sss))
    {
        string ss1 = sss.substr(0, sss.find('~'));
        string ss2 = sss.substr(sss.find('~') + 1);
        char rr = checkip(ss1);
        if (rr == 'N') { result[5]++;continue; }
        if(rr == 'W')continue;//傻逼题解,掩码错误,和ip不属于类混在一起
        bool rr1 = subwebcode(ss2);
        if (rr1 != true) { result[5]++;continue; }
        switch (rr)
        {
        case 'A':result[0]++;break;
        case 'B':result[1]++;break;
        case 'C':result[2]++;break;
        case 'D':result[3]++;break;
        case 'E':result[4]++;break;
        case 'S':result[6]++;break;
        case 'Y':result[0]++;result[6]++;break;
        case 'U':result[1]++;result[6]++;break;
        case 'M':result[2]++;result[6]++;break;
        case 'W':break;//不在任何一类
        }
    }
    for (int a : result)cout << a << " ";
    return 0;
}

全部评论

相关推荐

04-08 16:35
门头沟学院 Java
站队站对牛:实在是恶心的公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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