题解 | #识别有效的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;
}
