点击打开题目
/************************************************************************** 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] + '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; }