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

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

// 判断IP地址是否合法
bool judge_ip(const string& ip) {
    int j = 0;
    istringstream iss(ip);
    string seg;
    while (getline(iss, seg, '.')) {
        if (++j > 4 || seg.empty() || seg.size() > 3) return false;
        for (char c : seg) {
            if (!isdigit(c)) return false;
        }
        int val = stoi(seg);
        if (val < 0 || val > 255) return false;
    }
    return j == 4;
}

// 判断子网掩码是否合法
bool is_mask(const string& mask) {
    if (!judge_ip(mask)) return false; // 先检查是否为合法IP
    istringstream iss(mask);
    string seg;
    unsigned b = 0;
    while (getline(iss, seg, '.')) {
        b = (b << 8) + stoi(seg);
    }
    if (b == 0 || b == 0xFFFFFFFF) return false; // 全0或全1非法
    b = ~b + 1;
    return (b & (b - 1)) == 0; // 判断是否为连续的1和0
}

// 判断两个IP地址是否在同一个子网
bool isSameIp(const string& mask, const string& ip1, const string& ip2) {
    auto ipToInt = [](const string& ip) {
        istringstream iss(ip);
        string seg;
        unsigned val = 0;
        while (getline(iss, seg, '.')) {
            val = (val << 8) + stoi(seg);
        }
        return val;
    };
    unsigned maskVal = ipToInt(mask);
    unsigned ip1Val = ipToInt(ip1);
    unsigned ip2Val = ipToInt(ip2);
    return (maskVal & ip1Val) == (maskVal & ip2Val);
}

int main() {
    string mask, ip1, ip2;
    while (cin >> mask >> ip1 >> ip2) {
        if (!is_mask(mask) || !judge_ip(ip1) || !judge_ip(ip2)) {
            cout << 1 << endl;
            continue;
        }
        if (isSameIp(mask, ip1, ip2)) {
            cout << 0 << endl;
        } else {
            cout << 2 << endl;
        }
    }
    return 0;
}

全部评论

相关推荐

永不遗忘:才这么点算什么拉黑,我初筛连着挂几十次了,最后还是能进面
点赞 评论 收藏
分享
MScoding:你这个实习有一个是当辅导老师,这个和找技术岗没有关系吧?
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务