题解 | #判断两个IP是否属于同一子网#

判断两个IP是否属于同一子网

https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

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

bool is_mask(vector<int>& vec_mask){
    unsigned int m=0;
    for(int i=0;i<vec_mask.size();i++){
        m = m<<8;
        m += vec_mask[i];
    }
    m = ~m+1;

    // 如果为掩码,其二进制为1的数量只能为1
    bitset<32> b(m);
    if(b.count()==1)
        return true;
    return false;
}

bool is_ip(vector<int>& vec_ip){
    for(int i=0;i<vec_ip.size();i++){
        if(vec_ip[i]<0 || vec_ip[i]>255)
            return false;
    }
    return true;
}

int main() {
    // 输入
    string mask;
    string ip1,ip2;
    getline(cin, mask);
    getline(cin, ip1);
    getline(cin, ip2);

    vector<int> vec_mask;
    vector<int> vec_ip1;
    vector<int> vec_ip2;

    string s;
    stringstream ss_m(mask);
    while(getline(ss_m, s, '.'))
        vec_mask.push_back(stoi(s));
    stringstream ss_ip1(ip1);
    while(getline(ss_ip1, s, '.'))
        vec_ip1.push_back(stoi(s));
    stringstream ss_ip2(ip2);
    while(getline(ss_ip2, s, '.'))
        vec_ip2.push_back(stoi(s));

    // 不合法
    if(vec_mask.size()!=4 || vec_ip1.size()!=4 || vec_ip2.size()!=4){
        cout<<1;
        return 0;
    }

    //判断是否合法
    if(!(is_mask(vec_mask) && is_ip(vec_ip1) && is_ip(vec_ip2))){
        cout<<1;
        return 0;
    }

    unsigned int m=0;   // 掩码
    unsigned int p1=0;  // ip1
    unsigned int p2=0;  // ip2
    for(int i=0;i<vec_mask.size();i++){
        m = m<<8;
        p1 = p1<<8;
        p2 = p2<<8;
        m += vec_mask[i];
        p1 += vec_ip1[i];
        p2 += vec_ip2[i];
    }

    if((m&p1) == (m&p2)){
        cout<<0;
        return 0;
    }

    cout<<2;
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

Beeee0927:正确的建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务