题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

  1. 输入方式,我特别处理了,没有使用istringstream配合getline的字符切割方式,这里我专门写了一篇文章
    https://blog.csdn.net/weixin_39956356/article/details/118053985
  2. 判断合法mask,这是段经典的代码,核心就是判断2的幂,注意题目要求全1也是错误的
  3. 代码一次把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;
}
全部评论
cin.good() 学习了
点赞 回复 分享
发布于 2021-07-15 10:28

相关推荐

评论
2
收藏
分享
牛客网
牛客企业服务