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