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

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

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

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

vector<string> ipToVector(string ip){
    vector<string> v;
    int pos = ip.find_first_of('.');
    v.push_back(ip.substr(0,pos));
    ip = ip.substr(pos+1);

    pos = ip.find_first_of('.');
    v.push_back(ip.substr(0,pos));
    ip = ip.substr(pos+1);

    pos = ip.find_first_of('.');
    v.push_back(ip.substr(0,pos));
    ip = ip.substr(pos+1);

    pos = ip.find_first_of('.');
    v.push_back(ip.substr(0,pos));
    ip = ip.substr(pos+1);

    return v;
}

bool isValidIp(string ip){
    bool bisValid = true;
    // 解析出每一段数字,判断是否在 0 到 255之间
    vector<string> v = ipToVector(ip);

    for(auto s : v){
        int t = stoi(s);
        if(t < 0 || t > 255){
            bisValid = false;
        } 
    }
    return bisValid;
}

bool isValidMask(string ip){
    bool bisValid = true;
    // 先判断是否是合格IP
    if(!isValidIp(ip)){
        bisValid = false;
    }else{
        vector<string> v = ipToVector(ip);;
        
        size_t ans = 0;
        int len = v.size();
        for(int i = 0; i < len -1; ++i){
            int vi = stoi(v[i]);
            int vii = stoi(v[i+1]);

            if(vi < 255 && vii > 0){
                bisValid = false;
            }
        }
    }
    return bisValid;
}

size_t ipToInt(string ip){
    vector<string> v = ipToVector(ip);

    size_t ans = 0;
    for(auto s : v){
        size_t t = stoi(s);
        ans |= t;
        ans = ans << 8;
    } 
    return ans;
}

bool isSameNetWork(string ip1, string ip2, string mask){
    size_t ip11 = ipToInt(ip1);
    size_t ip22 = ipToInt(ip2);
    size_t mask1 = ipToInt(mask);

    size_t and1 = (ip11 & mask1);
    size_t and2 = (ip22 & mask1);

    return and1 == and2;
}

int main() {
    string mask, ip1, ip2;
    while(cin >> mask >> ip1 >> ip2){
        if(!isValidMask(mask) || !isValidIp(ip1) || !isValidIp(ip2)){
            cout << 1 << endl;
            continue;
        }

        if(isSameNetWork(ip1,ip2,mask)){
            cout << 0 << endl;  // 属于同一网络打印 0
        }else{
            cout << 2 << endl; // 不属于同一网络打印 2
        }
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

2025-12-15 14:07
广州南方学院 C++
小海c:hr在线简历会筛选你一遍,然后觉得符合预期,就跟你要简历,然后给对应部门那边审核,过了的话对应部门的人会面试你,然后那个部门大概率也是你回去的部门
点赞 评论 收藏
分享
2025-12-16 22:45
已编辑
电子科技大学 活动运营
Rain_Codin...:简历感觉有点乱了而且一股AI味,AI简历的一个特点就是废话很多,一个点能分成四个点来讲,可以仔细优化一下。 btw,手机看简历不好看出来,可以把电脑上的简历截图放出来。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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