问题 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; }