zoukankan      html  css  js  c++  java
  • 2016-2017学年第三次测试赛 问题 F: 签到题

    问题 F: 签到题

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 80  解决: 28

    题目描述

    在计算机网络考试中, 黑帅男神看到一个将IP网络分类的题, 精通C++的他瞬间写出了几行代码成功解决了这个问题

    请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类.

    现在假设将所有的IP地址划分为 A,B,C,D,E五类

    A类地址1.0.0.0~126.255.255.255;

    B类地址128.0.0.0~191.255.255.255;

    C类地址192.0.0.0~223.255.255.255;

    D类地址224.0.0.0~239.255.255.255;

    E类地址240.0.0.0~255.255.255.255

    请对输入的IP地址进行分类
     

    输入

    多组,第一行是一个T(T<=100000)
    接下来T行,每行一个ip地址(不保证正确)

    输出

    在上面5类中则输出对应类型
    不属于上述类型或IP错误则输出”nope”(不含引号)

    样例输入

    2 222.195.8.207 127.0.0.1

    样例输出

    C nope
     
    这题的思路很明确,就是:
    1.以“.”为分界,读取ip地址的每位一个段;
    2.然后首先判断是否是在1~225的范围内,然后判断前后有没有那些倒灶的字符串导致其根本不符合IP地址的标准;
    3.然后有一个小点,就是第一个字段的127不属于任何范围。
     
    实现需要的一些小技巧:sscanf
    sscanf的功能很强大,使用必须要哟有<stdio.h>头文件,然后要和c++兼容的话我有头文件<cstdio.h>这样就可以在C++的环境下使用这个函数了。
    sscanf功能的参考博文:http://blog.csdn.net/jackyvan/article/details/5349724
    附上代码:
    #include <iostream>
    #include<math.h>
    #include <iomanip>
    #include<cstdio>
    #include<string>
    #include<map>
    #include<vector>
    #include<list>
    #include<algorithm>
    #include<stdlib.h>
    #include<iterator>
    #include<sstream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    
    int main()
    {
        int n;
        cin>>n;
        int a,b,c,d;
        char ip[50]={};
        char s[200]={};
        while(n--)
        {
            a=-1;
            b=-1;
            c=-1;
            d=-1;
            cin>>ip;
    
            sscanf(ip,"%d.%d.%d.%d%s",&a,&b,&c,&d,s);//sscanf读取每个字段,1以“.”为分界
        //而且最大的好处是可以把字符串转化为int型的数组 那是甚好的。
            if(s[0]!=0||a>255 || a<0 || b>255 || b<0 ||c>255 || c<0 ||d>255 || d<0 )
            {
                cout<<"nope"<<endl;//第一组,判断就是判断是否每个字段都在 1~225的范围内
                continue;//不在 直接去下一个数
            }
           else if(a>=1&&a<=126)//根据第一组的数据判断是否在A组
            {
                cout<<"A"<<endl;
                continue;
            }
           else if(a>=128&&a<=191)//根据第一分段判断是否在B组
            {
                cout<<"B"<<endl;
                continue;
            }
           else if(a>=192&&a<=223)//判断是否在第C组
            {
                cout<<"C"<<endl;
                continue;
            }
          else  if(a>=224&&a<=239)//判断是否在D组
            {
                cout<<"D"<<endl;
                continue;
            }
          else  if(a>=240&&a<=255)//判断是否在E组
            {
                cout<<"E"<<endl;
                continue;
            }
            else
            {
                cout<<"nope"<<endl;//最后就是在1~225的范围内 第一个字段不符合要求的那些数字的排除
                continue;
            }
    
    
        }
        return 0;
    }
     
     
  • 相关阅读:
    利用SEH进行代码混淆
    HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1
    输入字符串反序输出
    微信公众平台开发(104) 自定义菜单扫一扫、发图片、发地理位置
    不同编码页面之间表单的提交方法
    PHP登陆Session验证
    微信公众平台开发培训
    微信公众平台开发(98) UnionID
    微信电商再侵袭,腾讯要革淘宝的命
    微信企业号
  • 原文地址:https://www.cnblogs.com/William-xh/p/7144347.html
Copyright © 2011-2022 走看看