/**************************************************************************
Date 2018/3/15 19:52
Author Wen Yaxin
解题思路:不合法的情况如下:
1.存在除数字和点以外的其他字符
2.出现连续点的情况
3.数字的个数不是4个或点的个数不是3个
4.数字是小于0或大于255
5.数字含有前导0.
PS:本来是个模拟水题,不想写题解,可是做了时候错了7次,
还是总结一下吧。
首先如果正向去思考,需要判断以上那么多种情况,在我WA到
吐的时候,我就想为何我不反过来想呢,因此采用逆向思维,
不再去考虑这么情况,做法如下。
直接将字符串种出现的数字求出,并存储,然后把每个数字
转化成字符串并在其后加'.',只考虑前4个数字,最后一个数字
后不加点,然后与原来的字符串进行比较(这意操作可以检测1,2,3,5),
如果相等,则再看存储的数组是否都位于0~255之间,如果符合,则再看
数字个数是否为4个,如果是,该字符串就是IP地址。
提醒一点:输入字符串用gets,因为给出的字符串可以是任意字符组成的,
会给出含有空格的字符串,如果这点不注意,会让你WA到哭。
变量含义:
str:接收输入的字符串
len:字符串的长度
a:存放字符串中连续出现的数字串转换成的整数
cnt:数字a的下标,最终为数字个数。
方法含义:
judge:判断是否为IP地址。
*********************************************************************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <string>
using namespace std;
char str[110],len;
int a[110],cnt;
bool judge() {
string s="",ip="";
int num = 0,cnt = 0;
for(int i = 0; i < len; i++) {
ip += str[i];
if(str[i]>='0' && str[i]<='9') {
num = num*10 + str[i]-'0';
}
else {
a[cnt++] = num;
num = 0;
}
}
a[cnt] = num;
cnt = min(cnt,3);
for(int i = 0; i <= cnt; i++) {
if(a[i] == 0) {
s += '0';
}
else {
string temp = "";
while(a[i]) {
char ch = a[i]%10 + '0';
temp += ch;
a[i] = a[i]/10;
}
for(int i = temp.length()-1; i >= 0; i--) {
s += temp[i];
}
}
s += '.';
}
ip += '\0';
int sLen = s.length();
s[sLen-1] = '\0';
//cout<<s<<endl;
if(s == ip) {
num = 0;
for(int i = 0; i < (int)s.length(); i++) {
if(s[i]>='0' && s[i]<='9') {
num = num*10 + s[i]-'0';
}
else {
if(num>=0 && num<=255) {
num = 0;
}
else {
return false;
}
}
}
if(num >= 0 && num <= 255) {}
else return false;
}
else {
return false;
}
if(cnt < 3) return false;
return true;
}
int main() {
while(gets(str)) {
len = strlen(str);
bool flag = judge();
if(flag) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
return 0;
}
HDU 2206:IP的计算
最新推荐文章于 2019-03-01 13:59:19 发布