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

相关推荐

11-29 00:55
门头沟学院
区域赛银,邀请赛金,打算十二月打下Java基础、背点八股、写个外卖后去投福建小厂的寒假实习,简历应该怎么写呢?以及福州/和厦门有推荐的小厂吗?
牛客53210502...:简历一页:把区域银,邀请赛金标粗,其他的奖除非凑一页否则没有必要写。或者多页:每个站一行这样都列出来。项目经历看看牛客其他人是怎么写的,写的不好呢。简历打磨好按部就班没问题的
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
哈哈哈,你是老六:我去,这面试还要靠抢啊
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务