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

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

#include<bits/stdc++.h>
using namespace std;
bool isIP(string ip){
    istringstream is(ip);
    string buffer;
    int num = 0;
    while(getline(is, buffer, '.')){
        num++;
        if(buffer.empty() || stoi(buffer) > 255){
            return false;
        }
    }
    if(num != 4){
        return false;
    }
    return true;
}

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

bool isMask(string ip){
    istringstream is(ip);
    string buffer;
    vector<int> save;
    while(getline(is, buffer, '.')){
        save.push_back(stoi(buffer));
    }
    unsigned int number = 0;
    for(auto s : save){
        number = (number << 8) + s;
    }
    if(!number){
        return false;
    }
    number = ~number;
    if(!number){
        return false;
    }
    while(number){
        if((number & 1) == 0){
            return false;
        }
        number = number >> 1;
    }
    return true;  
}

int main(){
    string input;
    int a = 0,b = 0,c = 0,d = 0,e = 0,err = 0,p = 0;
    while(cin >> input){
        istringstream is(input);
        string add;
        vector<string> v;
        while(getline(is,add,'~')){
            v.push_back(add);
        }
        int first = stoi(v[0].substr(0,v[0].find_first_of('.')));
        if(isIP(v[0]) && isIP(v[1]) && isMask(v[1])){
            if(isPrivate(v[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++;
        }
        else{
            if(first != 0 && first != 127){
                err++;
            }
        }
        
    }
    cout << a << " " << b << " " << c << " " << d << " " << e << " " << err << " " << p << endl;
    return 0;
}

全部评论

相关推荐

bg27强双非本,目前在学习golang后端gin框架部分,在b站找了一个轮子项目敲了一下,技术栈是gin&nbsp;+&nbsp;gorm&nbsp;+&nbsp;mysql&nbsp;+&nbsp;redis。我目前的想法是这一个月学习408和go八股以及刷算法然后在12月找个寒假实习然后大三下开始准备考研。我是考研意愿比较强烈,想问一下我是应该all&nbsp;in其中一个方向吗,我感觉我实习对我考研来说也是没什么帮助的好像。
牛客28967172...:毕业工作,考研,考公是完全不同的方向。 99%的人拼尽全力也只能把一个做好(能做好都已经是佼佼者了,比如进进大厂,考985或者考公) 如果你确定要考研可以不用学任何就业技术框架,也不用实习经验,刷题背知识点就行,但注意必须考92院校起步,因为这个年代双非硕毕业后完全不如双非本(互联网行业),可以说双非硕在互联网就业完全是负收益
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
八极星:有什么不能问的,(/_\),这又不是多珍贵的机会,你有什么可失去的
点赞 评论 收藏
分享
notbeentak...:就抓,嗯抓,开不开匿名都要抓,一点坏事不让说,就对公司顶礼膜拜佩服的五体投地就对了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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