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

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

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

# include <bits/stdc++.h>
using namespace std; 

bool processAddress(string& bin,string& address,bool isMask)
{
    /*
    逐位处理:
        若为数字:num+1
        若为.:
            若前一个不是数字:非法
            若前一个是数字:
                若在[0,255]内:数字转化为二进制存入bin
                若在外:非法
    若为掩码,判断是否合法
    */
    
    //逐位处理
    int num=0;
    address+='.';
    int addressSize=address.size();
    for(int i=0;i<addressSize;i++)
    {
        if(isdigit(address[i]))    //若为数字,储存在num中
        {
            num=num*10+address[i]-'0';
            if(num>255)    return false;    //若在[0,255]范围外,地址非法
        }
        else if(address[i]=='.')    //若为.,处理预先储存的数字
        {
            string numBin="";    //二进制字符串
            if(i>0 && !isdigit(address[i-1]))    return false;    //若前一位不是数字,地址非法
            while(num)    //num转换为二进制储存在numBin中(此处为倒序)
            {
                numBin+=num%2+'0';
                num/=2;
            }
            int zeroNeeded=8-numBin.size();    //若不足八位,用0补足
            while(zeroNeeded)
            {
                numBin+='0';
                zeroNeeded--;
            }
            reverse(numBin.begin(),numBin.end());    //numBin逆转为正序
            bin+=numBin;    //numBin存入bin
        }
        else
            return false;
    }
    if(bin.size()!=32)    return false;
    if(isMask)
    {
        bool inZeros=false;
        for(int i=0;i<32;i++)
        {
            if(bin[i]=='1' && inZeros)    return false;
            if(bin[i]=='0')    inZeros=true;
        }
    }
    return true;
}

bool isInSameNet(const string& ip1,const string& ip2,const string& mask)
{
    for(int i=0;i<32;i++)
    {
        /*
        cout<<i<<": ";
        cout<<"ip1: "<<ip1[i]<<"  ip2: "<<ip2[i]<<"  mask: "<<mask[i]<<endl;
        cout<<"ip1&&mask: ";
        if((ip1[i]-'0')&&(mask[i]-'0'))    cout<<1;
        else    cout<<0;
        cout<<' ';
        cout<<"ip2&&mask: ";
        if((ip2[i]-'0')&&(mask[i]-'0'))    cout<<1;
        else    cout<<0;
        cout<<endl;
        */
        if(((ip1[i]-'0')&&(mask[i]-'0'))!=((ip2[i]-'0')&&(mask[i]-'0')))    return false;
    }
    return true;
}

int main(){
    string mask,ip1,ip2;
    while(cin>>mask>>ip1>>ip2)
    {
        string maskBin,ip1Bin,ip2Bin;
        bool isMaskLegal=processAddress(maskBin,mask,true);
        bool isIp1Legal=processAddress(ip1Bin,ip1,false);
        bool isIp2Legal=processAddress(ip2Bin,ip2,false);
        //cout<<isMaskLegal<<isIp1Legal<<isIp2Legal<<endl;
/*
        cout<<"maskBin: "<<endl<<maskBin<<endl;
        cout<<"ip1Bin: "<<endl<<ip1Bin<<endl;
        cout<<"ip2Bin: "<<endl<<ip2Bin<<endl;
*/
        if(!(isMaskLegal && isIp1Legal && isIp2Legal))    cout<<1<<endl;    //存在非法
        else
            if(isInSameNet(ip1Bin,ip2Bin,maskBin))    cout<<0<<endl;
            else    cout<<2<<endl;
    }
    return 0;
}

全部评论

相关推荐

醒工硬件:1学校那里把xxxxx学院去了,加了学院看着就不像本校 2简历实习和项目稍微精简一下。字太多,面试官看着累 3第一个实习格式和第二个实习不一样。建议换行 4项目描述太详细了,你快把原理图贴上来了。比如可以这样描述:使用yyyy芯片,使用xx拓扑,使用pwm控制频率与占空比,进行了了mos/电感/变压器选型,实现了xx功能 建议把技术栈和你做的较为有亮点的工作归纳出来 5熟悉正反激这个是真的吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务