【华为oj】合法ip
2015-08-09 21:12
441 查看
问题描述
现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。
知识点 字符串,循环,链表,队列,栈,查找,搜索,排序,树,图,数组,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入
输入一个ip地址
输出
返回判断的结果YES or NO
样例输入 10.138.15.1
样例输出 YES
问题分析:没什么特别的,就是要考虑的情况因素很多。看main函数
现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。
知识点 字符串,循环,链表,队列,栈,查找,搜索,排序,树,图,数组,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入
输入一个ip地址
输出
返回判断的结果YES or NO
样例输入 10.138.15.1
样例输出 YES
问题分析:没什么特别的,就是要考虑的情况因素很多。看main函数
#include <iostream> #include <string> using namespace std; # define maxsize 100 bool isnum( char num) { if(('0'<=num)&&(num<='9')) return true; else return false; } int change(string str) { int a[3]; int i=0; for(i=0;i<3;i++) a[i]=int(str[i])-48; return a[0]*100+a[1]*10+a[2]; } bool ispartip(string str)//判断子字符串是否合法 { int len=str.length(); if(len>3) return false;//超过三位数,return false else { int i=0; for(i=0;i<len;i++)//判断是不是全是数字 { if(!isnum(str[i])) return false; } //把三位的数字字符转化为数字 if(len==3) { int numip=change(str); if(numip>255) return false; } } return true; } bool isipzero(string str)//ip地址全是0 { int i=0; for(i=0;i<str.length();i++) { if(str[i]!='0'&& str[i]!='.') return true; } return false; } int main() { string s; getline(cin,s); int pos[maxsize]={0};//记录三个point的位子 int l=s.length(); int i=0,k=0; for(i=0;i<l;i++) { if(s[i]=='.') { pos[k]=i; k++; } } if(k==3)//找到三个point".",则继续判断,否则一定不是合法ip【点的个数】 { if(pos[2]-pos[1]==1||pos[1]-pos[0]==1)//三个点相邻,一定不是合法ip【点的位置】 { cout<<"NO"<<endl; return 0; } else { if(isipzero(s))//【判断s中是不是全为0.比如0.0.0.0或者00.00.0.000这样的不是合法ip】 { if(ispartip(s.substr(0,pos[0]))&&ispartip(s.substr(pos[0]+1,pos[1]-pos[0]-1))&&ispartip(s.substr(pos[1]+1,pos[2]-pos[1]-1))&&ispartip(s.substr(pos[2]+1,l-pos[2]-1))) //按三个point的位子,分割出四个子字符串,并分别判断四个子字符串是否合法 { cout<<"YES"<<endl; return 0; } else { cout<<"NO"<<endl; return 0; } } else { cout<<"NO"<<endl; return 0; } } } else { cout<<"NO"<<endl; return 0; } return 0; }
相关文章推荐
- 机房—组合查询
- 免费阿里云服务器ECS初探
- nginx - 性能优化,突破十万并发
- java多线程
- Javascript 严格模式详解
- 利用keychain保存iphone唯一识别码idfv
- 响应式布局
- DNS原理及其解析过程【精彩剖析】
- 周赛一 CodeForces 479A
- Xcode 6 打包ipa文件
- ZOJ 3888 Twelves Monkeys (优先队列+预处理)
- OC循环引用另一种解决方案:最后你放手,换来彼此的自由!
- 针对Bug的管理措施
- 树状数组 hdu2492 Ping pong
- 浅析startService在一个新进程中启动的流程
- 内存对齐规则
- Python 3.4 学习总结 (2)
- 内存中关于开辟空间,堆,栈,静态区
- 3、通过按键S1产生外部中断改变LED1状态(it's 中断-寄存器和中断子程序)
- 1.5 快速找出故障的机器