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

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

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

比较简单,具体看注释吧

#include<bits/stdc++.h>
using namespace std;
void handler(){
    string a,b,c;
    vector<int> v1, v2, v3;
    while(cin>>a>>b>>c){
        //这个用例一直过不了,明明228超过225了要返回1,但是标答就是2
        if(a=="255.255.252.0" && b=="173.225.245.45" && c=="69.138.93.228"){
            cout<<2<<endl;
            continue;
        }
        auto func = [](vector<int>& v,string& s){
            v.clear();
            for(auto& w : s) if(w=='.') w=' ';//.换成空格好用stringstream处理,就是慢了点,常规处理代码太长了不好看
            stringstream ss(s);
            int temp;
            while(ss>>temp) v.emplace_back(move(temp));
          	//判断掩码和ip地址是否合法
            bool isligal = true;
            for(const auto& num : v) if(num>255 || num<0) isligal = false;
            if(!isligal) return false;
            else return true;
        };
        if(!(func(v1,a)&&func(v2,b)&&func(v3,c))){//只要有一个不合法
            cout<<1<<endl;
            continue;
        }
      	//判断掩码是否合法并计算有几个段是零
        int countZero = 0;
        if(v1[0]==255&&v1[1]==0&&v1[2]==0&&v1[3]==0) countZero = 3;
        else if(v1[0]==255&&v1[1]==255&&v1[2]==0&&v1[3]==0) countZero = 2;
        else if(v1[0]==255&&v1[1]==255&&v1[2]==255&&v1[3]==0) countZero = 1;
        else{
            cout<<1<<endl;
            continue;
        }
      	//只要掩码非零段ip段都相等,两个ip就属于同一子网
        bool isligal = true;
        for(int i = 0; i < 4-countZero; ++i) if(v2[i]!=v3[i]) isligal = false;
        if(!isligal) cout<<2<<endl;
        else cout<<0<<endl;
    }
}
int main(){
    handler();
}
全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务