题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
- 输入方式,我特别处理了,没有使用istringstream配合getline的字符切割方式,这里我专门写了一篇文章
https://blog.csdn.net/weixin_39956356/article/details/118053985 - 判断合法mask,这是段经典的代码,核心就是判断2的幂,注意题目要求全1也是错误的
- 代码一次把8个点分十进制数全部读入内存,
#include <bits/stdc++.h> using namespace std; int main(int argc, char* argv[]) { cin.tie(0), cout.tie(0), ios::sync_with_stdio(0); int a = 0, b = 0, c = 0, d = 0, e = 0, error = 0, private__ = 0; int number; while (cin.good()) { vector<int> ip_mask; while (cin >> number) { ip_mask.push_back(number); if (cin.get() == '\n') break; } if (!cin.good()) break; if (ip_mask.size() != 8) { ++error; string word; /**<丢弃改行的剩下部分 */ getline(cin, word); continue; } /**<处理掩码 */ unsigned int mask = 0; /**<使用一个无符号数就可以存下 */ for (int i = 4; i < 8; ++i) { mask += ip_mask[i] << (8 * (7-i)); } if (mask == 0) { /**<0.0.0.0也是非法 */ ++error; continue; } mask = ~mask; if (mask == 0) { /**<题目要排除255.255.255.255 */ ++error; continue; } if ((mask & (mask+1))!=0) { ++error; continue; } if (ip_mask[0] == 0 || ip_mask[0] == 127) { continue; } else if (ip_mask[0] >= 1 && ip_mask[0] <= 126) { ++a; if (ip_mask[0] == 10) ++private__; } else if (ip_mask[0] >= 128 && ip_mask[0] <= 191) { ++b; if (ip_mask[0] == 172 && (ip_mask[1] >= 16 && ip_mask[1] <= 31)) ++private__; } else if (ip_mask[0] >= 192 && ip_mask[0] <= 223) { ++c; if (ip_mask[0] == 192 && ip_mask[1] == 168) ++private__; } else if (ip_mask[0] >= 224 && ip_mask[0] <= 239) { ++d; } else if (ip_mask[0] >= 240 && ip_mask[0] <= 255) { ++e; } } cout << a << " " << b << " " << c << " " << d << " " << e << " " << error << " " << private__; return 0; }