题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
用到正则表达式来简化代码,先判断掩码是否正确,然后判断IP地址是否正确,最终输出统计结果。
#include <iostream> #include <regex> #include <cmath> using namespace std; void analysisAddr(vector<int> & nums, string s); void judgePri(const vector<int> & nums, int & pri_addr); int main() { regex regex("\\d+\\.\\d+\\.\\d+\\.\\d+~\\d+\\.\\d+\\.\\d+\\.\\d+"); string s; int A = 0; int B = 0; int C = 0; int D = 0; int E = 0; int mistake = 0; int pri_addr = 0; string ip; string host; vector<int> nums; int num; bool flag = true; bool conti = false; bool high = false; while (getline(cin, s)) { if(!regex_match(s, regex)) { mistake++; continue; }; ip = s.substr(0, s.find('~')); host = s.substr(s.find('~') + 1); nums.clear(); analysisAddr(nums, ip); if (nums.at(0) == 0 || nums.at(0) == 127) { continue; } nums.clear(); analysisAddr(nums, host); if (nums.at(0) == 0 || nums.at(3) == 255) { mistake++; continue; } for (int num : nums) { if (flag == false) { if (num != 0) { mistake++; conti = true; flag = true; break; } } else { if (num != 255) { flag = false; if (high == true && num == 0) { continue; } if (num != 254 && num != 252 && num != 248 && num != 240 && num != 224 && num != 192 && num != 128) { mistake++; conti = true; break; } } else { high = true; } } } flag = true; high = false; if (conti == true) { conti = false; continue; } nums.clear(); analysisAddr(nums, ip); if (nums.at(0) >= 1 && nums.at(0) <= 126 && nums.at(1) < 256 && nums.at(2) < 256 && nums.at(3) < 256) { A++; judgePri(nums, pri_addr); continue; } else if (nums.at(0) >= 128 && nums.at(0) <= 191 && nums.at(1) < 256 && nums.at(2) < 256 && nums.at(3) < 256) { B++; judgePri(nums, pri_addr); continue; } else if (nums.at(0) >= 192 && nums.at(0) <= 223 && nums.at(1) < 256 && nums.at(2) < 256 && nums.at(3) < 256) { C++; judgePri(nums, pri_addr); continue; } else if (nums.at(0) >= 224 && nums.at(0) <= 239 && nums.at(1) < 256 && nums.at(2) < 256 && nums.at(3) < 256) { D++; continue; } else if (nums.at(0) >= 240 && nums.at(0) <= 255 && nums.at(1) < 256 && nums.at(2) < 256 && nums.at(3) < 256) { E++; continue; } if (nums.at(0) == 0 || nums.at(0) == 127) { continue; } mistake++; } cout << A << ' ' << B << ' ' << C << ' ' << D << ' ' << E << ' ' << mistake << ' ' << pri_addr; } void analysisAddr(vector<int> & nums, string s) { int start = 0; int end; end = s.find('.'); while (true) { end = s.find('.', start); if (s.find('.', start) == string::npos) { nums.push_back(stoi(s.substr(start))); break; } nums.push_back(stoi(s.substr(start, end - start))); start = end + 1; } } void judgePri(const vector<int> & nums, int & pri_addr) { if (nums.at(0) == 10 && nums.at(0) <= 255 && nums.at(1) < 256 && nums.at(2) < 256 && nums.at(3) < 256) { pri_addr++; } if (nums.at(0) == 172 && nums.at(1) >= 16 && nums.at(1) <= 31 && nums.at(2) < 256 && nums.at(3) < 256) { pri_addr++; } if (nums.at(0) == 192 && nums.at(1) == 168 && nums.at(2) < 256 && nums.at(3) < 256) { pri_addr++; } } // 64 位输出请用 printf("%lld")
较难(算法题解) 文章被收录于专栏
较难难度题目