题解 | #识别有效的IP地址和掩码并进行分类统计#
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include<bits/stdc++.h> using namespace std; bool isIP(string ip){ istringstream is(ip); string buffer; int num = 0; while(getline(is, buffer, '.')){ num++; if(buffer.empty() || stoi(buffer) > 255){ return false; } } if(num != 4){ return false; } return true; } bool isPrivate(string ip){ istringstream is(ip); string buffer; vector<int> save; while(getline(is, buffer, '.')){ save.push_back(stoi(buffer)); } if(save[0] == 10) return true; if(save[0] == 172 && (save[1] >= 16 && save[1] <= 31)) return true; if(save[0] == 192 && save[1] == 168) return true; return false; } bool isMask(string ip){ istringstream is(ip); string buffer; vector<int> save; while(getline(is, buffer, '.')){ save.push_back(stoi(buffer)); } unsigned int number = 0; for(auto s : save){ number = (number << 8) + s; } if(!number){ return false; } number = ~number; if(!number){ return false; } while(number){ if((number & 1) == 0){ return false; } number = number >> 1; } return true; } int main(){ string input; int a = 0,b = 0,c = 0,d = 0,e = 0,err = 0,p = 0; while(cin >> input){ istringstream is(input); string add; vector<string> v; while(getline(is,add,'~')){ v.push_back(add); } int first = stoi(v[0].substr(0,v[0].find_first_of('.'))); if(isIP(v[0]) && isIP(v[1]) && isMask(v[1])){ if(isPrivate(v[0])) p++; if(first > 0 && first <127) a++; else if(first > 127 && first <192) b++; else if(first > 191 && first <224) c++; else if(first > 223 && first <240) d++; else if(first > 239 && first <256) e++; } else{ if(first != 0 && first != 127){ err++; } } } cout << a << " " << b << " " << c << " " << d << " " << e << " " << err << " " << p << endl; return 0; }