题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <cctype> #include <exception> #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() - l)); //使用stoi切记其没有合法性检验,会直接抛异常 } return v; } bool isValid(vector<int>& v) { for (int num : v) { if (num < 0 || num > 255) return false; } return true; } void judgeKind(int m, vector<int>& kind) { if (m >= 1 && m <= 126) ++kind[0]; else if (m >= 128 && m <= 191) ++kind[1]; else if (m >= 192 && m <= 223) ++kind[2]; else if (m >= 224 && m <= 239) ++kind[3]; else if (m >= 240 && m <= 255) ++kind[4]; } bool isPirv(int m, int n) { bool b = false; if (m == 10) b = true; else if (m == 172 && n >= 16 && n <= 31) b = true; else if (m == 192 && n == 168) b = true; return b; } bool isValidMask(vector<int>& mask) { if (!isValid(mask)) return false; vector<int> temp; for (int num : mask) { bitset<8> bits(num); for (int i = 7; i >= 0; i--) temp.push_back(bits[i]); } if (temp.front() == 0 || temp.back() == 1) return false; int idx = 0; while (idx < temp.size() && temp[idx] == 1) ++idx; while (idx < temp.size()) { if (temp[idx] == 1) return false; else ++idx; } return true; } int main() { vector<int> kind(5, 0); //ABCDE int err = 0, priv = 0; string s; while (cin >> s) { string sIp = s.substr(0, s.find('~')), sMask = s.substr(s.find('~') + 1); vector<int> ip, mask; try { ip = shift(sIp); } catch (exception) { ip = {-1, 0, 0, 0}; } try { mask = shift(sMask); } catch (exception) { mask = {-1, 0, 0, 0}; } if (ip[0] == 0 || ip[0] == 127) continue; if (!isValid(ip) || !isValidMask(mask)) ++err; else { judgeKind(ip[0], kind); if (isPirv(ip[0], ip[1])) ++priv; } } for (int i = 0; i < 5; i++) cout << kind[i] << " "; cout << err << " " << priv; }