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

183 篇文章 0 订阅
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>

using namespace std;



bool checked_ip(string ip,vector<int> &vip)
{
    vector<string> part;
    string::size_type ip_size=ip.size();
    int pointCount=0;
    int i,num;
    string::size_type index=0;
    string::size_type prePoint=0;
    while((index=ip.find_first_of('.',index))!=string::npos)
    {
        if(index>prePoint)
            part.push_back(ip.substr(prePoint,index-prePoint));
        ++index;
        prePoint=index;
        ++pointCount;
    }
    if(prePoint<ip_size)
        part.push_back(ip.substr(prePoint));
    if(part.size()!=4)
        return false;
    for(i=0;i<4;i++)
    {
        num=atoi(part[i].c_str());
        vip.push_back(num);
        if(num<0||num>255)
            return false;
    }
    return true;
}

bool checked_mask(string mask,vector<int> &vmask)
{
    return checked_ip(mask,vmask);
}

bool checked_same(vector<int> vip1,vector<int> vip2,vector<int> vmask)
{
    int i;
    int r1,r2;
    for(i=0;i<4;i++)
    {
        r1=vip1[i]&vmask[i];
        r2=vip2[i]&vmask[i];
        if(r1!=r2)
            return false;
    }
    return true;
}

int checkNetSegment(string mask, string ip1, string ip2)
{
    vector<int> vip1;
    vector<int> vip2;
    vector<int> vmask;
    if(checked_ip(ip1,vip1)&&checked_ip(ip2,vip2)&&checked_mask(mask,vmask))
    {
        if(checked_same(vip1,vip2,vmask))
            return 0;
        else
            return 2;
    }
    else
        return 1;
}

int main()
{
    string mask,ip1,ip2;

    while(cin>>mask>>ip1>>ip2)
    {
        cout<<checkNetSegment(mask,ip1,ip2)<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值