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

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

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

思路:
1、三个字符串分别保存掩码与两个IP地址
cin >> mask >> A >> B
2、构造函数判断掩码和IP是否合法,并将其转换为32位二进制保存在unsigned类型中。
IP地址判断:
①是否是四段
②是否超出范围0~255
③是否为空
掩码判断:
①首先要是合法IP地址
②不能全为0或全为1
③前N位需要为连续的1
unsigned val, ipa, ipb;
judegmask(val, mask) && judgeip(ipa, A) && judgeip(ipb, B)
3、根据条件输出

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

//判断掩码
bool judegmask(unsigned& val, string str) {
//检查是否为合法IP,并将32位二进制保存在val中
    istringstream iss(str);
    string substr;
    int flag = 0;
    while (getline(iss, substr, '.')) {
        ++flag;
        if (flag > 4 || substr.empty() || stoi(substr) > 255 ||  stoi(substr) < 0)
            return false;
        else val = (val << 8) | stoi(substr);
    }
    if (flag != 4) return false;
//检查是否为合法掩码
    unsigned linshi = val;
    if (!linshi) return false;//是否为全0
    linshi = ~linshi + 1;
    if (linshi == 1) return false;//是否为全1
    bitset<32> bs(linshi);
    if (bs.count() == 1) return true;//是否前N位均为1
    return false;
}

bool judgeip(unsigned& val, string str) {
    istringstream iss(str);
    string substr;
    int flag = 0;
    while (getline(iss, substr, '.')) {
        ++flag;
        if (flag > 4 || substr.empty() || stoi(substr) > 255 ||stoi(substr) < 0 )
            return false;
        else val = (val << 8) | stoi(substr);
    }
    if (flag != 4) return false;
    return true;
}


int main() {

    string  mask, A, B;
    while (cin >> mask >> A >> B) {
        unsigned val, ipa, ipb;
        if(judegmask(val, mask) && judgeip(ipa, A) && judgeip(ipb, B)){
            if ((val & ipa) == (val & ipb)) cout << "0" << endl;
            else cout << "2" << endl;
        }
        else cout << "1" << endl;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务