题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
思路:
1、三个字符串分别保存掩码与两个IP地址
cin >> mask >> A >> B
2、构造函数判断掩码和IP是否合法,并将其转换为32位二进制保存在unsigned类型中。
IP地址判断:
①是否是四段
②是否超出范围0~255
③是否为空
掩码判断:
①首先要是合法IP地址
②不能全为0或全为1
③前N位需要为连续的1
unsigned val, ipa, ipb;
judegmask(val, mask) && judgeip(ipa, A) && judgeip(ipb, B)
3、根据条件输出
#include <iostream>
#include <string>
#include <sstream>
#include <bitset>
using namespace std;
//判断掩码
bool judegmask(unsigned& val, string str) {
//检查是否为合法IP,并将32位二进制保存在val中
istringstream iss(str);
string substr;
int flag = 0;
while (getline(iss, substr, '.')) {
++flag;
if (flag > 4 || substr.empty() || stoi(substr) > 255 || stoi(substr) < 0)
return false;
else val = (val << 8) | stoi(substr);
}
if (flag != 4) return false;
//检查是否为合法掩码
unsigned linshi = val;
if (!linshi) return false;//是否为全0
linshi = ~linshi + 1;
if (linshi == 1) return false;//是否为全1
bitset<32> bs(linshi);
if (bs.count() == 1) return true;//是否前N位均为1
return false;
}
bool judgeip(unsigned& val, string str) {
istringstream iss(str);
string substr;
int flag = 0;
while (getline(iss, substr, '.')) {
++flag;
if (flag > 4 || substr.empty() || stoi(substr) > 255 ||stoi(substr) < 0 )
return false;
else val = (val << 8) | stoi(substr);
}
if (flag != 4) return false;
return true;
}
int main() {
string mask, A, B;
while (cin >> mask >> A >> B) {
unsigned val, ipa, ipb;
if(judegmask(val, mask) && judgeip(ipa, A) && judgeip(ipb, B)){
if ((val & ipa) == (val & ipb)) cout << "0" << endl;
else cout << "2" << endl;
}
else cout << "1" << endl;
}
}