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