题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#include <iostream> #include <vector> #include <bitset> using namespace std; vector<int> shift(const string& s) { vector<int> v(4); int l = 0, idx = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == '.') { v[idx++] = stoi(s.substr(l, i - l)); l = i + 1; } v[idx] = stoi(s.substr(l, s.size())); //使用stoi切记其没有合法性检验,会直接抛异常 } return v; } bool isValid(vector<int>& v) { for (int num : v) { if (num < 0 || num > 255) return false; } return true; } bool isSame(vector<int>& v1, vector<int>& v2, vector<int>& mask) { for (int i = 0; i < 4; i++) { int m = v1[i] & mask[i]; int n = v2[i] & mask[i]; if (m != n) return false; } return true; } int main() { string s1, s2, s3; cin >> s1 >> s2 >> s3; vector<int> v0 = shift(s1); vector<int> v1 = shift(s2); vector<int> v2 = shift(s3); if (!isValid(v0) || !isValid(v1) || !isValid(v2)) { //注意掩码也要判断0-255 cout << 1; return 0; } vector<int> mask; //把掩码的每一位按顺序存于数组,再遍历一遍进行合法性检验 for (int num : v0) { bitset<8> b(num); for (int i = 7; i >= 0; i--) mask.push_back(b[i]); //注意b[0]表示的是最低位,b[7]才是最高位 } int idx = 0; //掩码必须是连续的1加连续的0;(也可能全1或者全0) for (; idx < mask.size(); idx++) if (mask[idx] == 0) break; for (; idx < mask.size(); idx++) if (mask[idx] == 1) { cout << 1; return 0; } if (isSame(v1, v2, v0)) cout << 0; else cout << 2; return 0; }