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