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

相关推荐

点赞 评论 收藏
分享
机智的豹子有点心碎:UU我还在找工作还没找到,一直在搜简历怎么改,总结了这些: 1.SEO:简历根据每一个岗位定制化:使用这个岗位中所描述的工作的词,它要求什么技能就把自己的技能描述成什么样子,把SEO用在自己身上(把我的简历和个人特质,当成一个热门产品来做 “搜索引擎优化”),让HR能用最低的门槛看到我 2."顺序:把岗位要求的技能跟经历放在简历的最开头、最显眼的位置" 3.包装:简历是一个最终交付说明书,只要最终学习成长做得到就可以,在合适的范围内自我吹捧(我这个人怎么能够在HR的角度被迅速的看懂和看到,减轻HR的工作压力) 4.每点加小标题​:用6~10字概括该段内容,便于面试官快速抓取信息。 5.避免空泛描述​:拒绝“培养了组织能力”等泛泛而谈,替换为具体行动和成果。 6."使用“三段式结构”​​:每段经历按“为什么做-做了什么-结果如何”展开: ​a) 为什么做​:痛点或目标(例如“品牌声量不足”) ​b) 做​了什么:方法论(例如“趋势洞察+竞品对标+人群细分”) ​c) 结果如何​:量化成果或影响(例如“推动客户投放20万预算”)" 7.量化成果​:用数字体现工作成效(如“整理500+份资料”“撰写2万字报告”)。 这些有的是我想去的岗的,如果对你有用的话按需修改就好~加油,早日上岸!
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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