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

