题解 | #识别有效的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;
}
查看2道真题和解析


