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

相关推荐

12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务