http://acm.hdu.edu.cn/showproblem.php?pid=2206
//在wrong 10次后终于AC
//为何简单的题目要考虑这么久?
#include<iostream>//2265653 2010-03-29 21:34:12 Accepted 2206 0MS 228K 1452 B C++ 悔惜晟
#include<string>
#include<cstdio>
using namespace std;
int main()
{
char str[104];
int i, j, k, num1;
while(gets(str))
{
for(i = 0; str[i] ==' '; i++);//输入有空格的情况例如: 1.2.3.2
for( j = strlen(str) - 1; str[j] ==' '; j--);//最后也有空格
if(str[i] =='.' || str[j] == '.')//开始和最后是‘.’
{
printf("NO/n");
continue;
}
if(j - i > 14 || j - i < 6)//比最大的长,比最小的短
{
printf("NO/n");
continue;
}
int num = 0;
bool flag = false;
for(k = i; k <= j ; k++)
{
if(str[k] =='.') num++;
else if(!(str[k] >='0' && str[k] <= '9'))//有不合法的字符
{
flag =true;
break;
}
}
if(num > 3 || flag)
{
printf("NO/n");
continue;
}
int sum= 0;
int a = 0;
num1 = 0;
flag = false;
str[j+1] = '.';
for(k = i; k <= j+1; k++)
{
if(str[k] != '.')
{
a += str[k] - '0';
num1++;
a *= 10;
}
else
{
if( num1 == 1 && a /10 >=0 )
{
a = 0;
num1 = 0;
continue;
//flag = true;
//break;
}
else if(num1 == 2 && a /10 >=10 )//1.00.2.3不合法
{
//flag = true;
//break;
a = 0;
num1 = 0;
continue;
}
else if(num1 == 3 && a /10 >=100 && a /10 <= 255 ) //12.23.003.2 1.23.25.256 不合法
{
a = 0;
num1 = 0;
continue;
}
else //1111.23.2.3不合法
{
flag = true;
break;
}
}
}
//if(flag)
//printf("NO/n");
//else
if(!flag && num == 3)
printf("YES/n");
else
printf("NO/n");
}
}