题解 | #识别有效的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;
}

全部评论

相关推荐

01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务