题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#include <bitset>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
bool is_mask(vector<int>& vec_mask){
unsigned int m=0;
for(int i=0;i<vec_mask.size();i++){
m = m<<8;
m += vec_mask[i];
}
m = ~m+1;
// 如果为掩码,其二进制为1的数量只能为1
bitset<32> b(m);
if(b.count()==1)
return true;
return false;
}
bool is_ip(vector<int>& vec_ip){
for(int i=0;i<vec_ip.size();i++){
if(vec_ip[i]<0 || vec_ip[i]>255)
return false;
}
return true;
}
int main() {
// 输入
string mask;
string ip1,ip2;
getline(cin, mask);
getline(cin, ip1);
getline(cin, ip2);
vector<int> vec_mask;
vector<int> vec_ip1;
vector<int> vec_ip2;
string s;
stringstream ss_m(mask);
while(getline(ss_m, s, '.'))
vec_mask.push_back(stoi(s));
stringstream ss_ip1(ip1);
while(getline(ss_ip1, s, '.'))
vec_ip1.push_back(stoi(s));
stringstream ss_ip2(ip2);
while(getline(ss_ip2, s, '.'))
vec_ip2.push_back(stoi(s));
// 不合法
if(vec_mask.size()!=4 || vec_ip1.size()!=4 || vec_ip2.size()!=4){
cout<<1;
return 0;
}
//判断是否合法
if(!(is_mask(vec_mask) && is_ip(vec_ip1) && is_ip(vec_ip2))){
cout<<1;
return 0;
}
unsigned int m=0; // 掩码
unsigned int p1=0; // ip1
unsigned int p2=0; // ip2
for(int i=0;i<vec_mask.size();i++){
m = m<<8;
p1 = p1<<8;
p2 = p2<<8;
m += vec_mask[i];
p1 += vec_ip1[i];
p2 += vec_ip2[i];
}
if((m&p1) == (m&p2)){
cout<<0;
return 0;
}
cout<<2;
return 0;
}
// 64 位输出请用 printf("%lld")


查看11道真题和解析