题解 | #识别有效的IP地址和掩码并进行分类统计#C++
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <iostream>
#include<vector>
using namespace std;
vector<string> splits(string& s, char c) {
string temp;
vector<string>result;
int start = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == c) {
temp = s.substr(start, i - start);
result.push_back(temp);
start = i + 1;
}
if (i == (s.size() - 1)) {
temp = s.substr(start, i - start + 1);
result.push_back(temp);
}
}
return result;
}
int main() {
string temp = " ";
int a, b;
vector<string> rep;
vector<vector<string>> IP_MASK;
while (temp.size()) { // 注意 while 处理多个 case
getline(cin, temp);
rep.push_back(temp);
}
int line = rep.size() - 1;
vector<string> temp_Ip;
vector<string> temp_mask;
vector<int>resultv(7);
for (int i = 0; i < line; ++i) {
int flag = 10;
IP_MASK.push_back(splits(rep[i], '~'));
// cout << IP_MASK[i][0] << "mask" << IP_MASK[i][1] << endl;
temp_Ip = splits(IP_MASK[i][0], '.') ;
temp_mask = splits(IP_MASK[i][1], '.');
if (stoi(temp_Ip[0]) >= 240 && stoi(temp_Ip[0]) <= 255) {
flag = 4;
} else if (stoi(temp_Ip[0]) >= 224) {
flag = 3;
} else if (stoi(temp_Ip[0]) > 192) {
flag = 2;
} else if (stoi(temp_Ip[0]) == 192) {
flag = 8; //私有
if (stoi(temp_Ip[1]) != 168) {
flag = 2; //C
}
} else if (stoi(temp_Ip[0]) >= 128) {
if (stoi(temp_Ip[0]) == 172) {
flag = 7; //私有
if (stoi(temp_Ip[1]) != 16) {
flag = 1; //B
}
} else
flag = 1;
} else if (stoi(temp_Ip[0]) >= 1 && stoi(temp_Ip[0]) <= 126) {
if (stoi(temp_Ip[0]) == 10)
flag = 6; //私有
else
flag = 0;
}
for (int j = 1; j < 4; ++j) {
if (temp_Ip[j].size() == 0 || stoi(temp_Ip[j]) < 0 || stoi(temp_Ip[j]) > 255) {
flag = 5;//错误IP
break;
}
}
if (flag > 5 && flag != 10) {
resultv[6]++;
resultv[flag - 6]++; //私有IP也属于ABC其中一类,也需要加上
} else if(flag!=10)
resultv[flag]++; //ABCD 错误类
// flag=0;
// 判断掩码是否正确
for (int j = 0; j < temp_mask.size(); ++j) {
if(flag==10)continue; //忽略0.*.*.*和127.*.*.*
if ((temp_mask[0].size() == 0 ||
(stoi(temp_mask[j]) != 0 && stoi(temp_mask[j]) != 255)) ||
(j < temp_mask.size() - 1 && temp_mask[j] < temp_mask[j + 1]) ||
(j == temp_mask.size() - 1 && stoi(temp_mask[temp_mask.size() - 1]) != 0)) {
if ( (stoi(temp_mask[j]) != 0 && stoi(temp_mask[j]) != 255)&& // 不为0 的情况1~254
((j < temp_mask.size() - 1 && stoi(temp_mask[j + 1])==0) || //掩码前大于后,规避128.1.0.0被识别为正确掩码
(j == temp_mask.size() - 1 && stoi(temp_mask[temp_mask.size() - 1]) != 0))//如果掩码前面都是255,最后一位不为0 的情况,规避255.255.255.128 误识别为错误掩码
) {
int t = stoi(temp_mask[j]);
int flag1 = 9;
int flag0 = 0;
for (int z = 7; z >= 0; --z) {
if (t & 1 << z) {
flag1 = z;
}//1
else
flag0 = z;
if (flag1 < flag0) {
break;
}
}
if (flag1 > flag0) {
break;
}
}
if (flag != 5)
if (flag > 5){
resultv[flag - 6]--;
resultv[6]--;
}else {
resultv[flag ]--;
}
flag = 5;//错误掩码
resultv[flag]++;
break;
}
}
// if(flag==5){
// resultv[flag]++;
// }else {
// continue;
// }
// cout << flag << endl;;
}
for (int i = 0; i < 7; ++i) {
cout << resultv[i] << ' ';
}
// cout << '0';
}
// 64 位输出请用 printf("%lld")