题解 | #判断两个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;
}

