http://acm.scu.edu.cn/soj/problem.action?id=1103
可以写的更简洁干练一点,不过太麻烦,懒得改,备注一下吧,防止以后忘记
#include<cstdio>
#include<cstring>
using namespace std;
char str[40];
int main()
{
while(~scanf("%s",&str))
{
int count = 0;
int flag = -1;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(str[i] == '.'&& i != 0) //防止第一位就是. 比如.1.2.3.4
{
if(str[i-1] > 57 || i-flag > 4) //数字每一位最大为9, 9+'0' = 57,所以如果 > 57 则为字母
break; //当数字很大溢出会小于题目给的255,比如1.1.1.4294967297 100000000000.2.3.4,所以直接用位数判断很方便
int k = 1;
int sum = 0;
int ok = 0;
for(int j = i-1; j > flag; j--)
{
sum += (str[j]-48)*k;
k = 10*k;
ok = 1;
if(sum > 255) break;
//printf("2::::%d %d %d\n",i,j,sum);
}
if(sum!= 0 && sum == sum-(str[flag+1]-48)*k) //判断首位是不是0开头但不全是0,比如 01.2.3.4 不可以,1.2.3.4 可以
break;
if(sum <= 255&&sum >=0 && ok)
{
count++;
//printf("3::::%d %d \n",sum,count);
}
else
break;
flag = i;
}
}
int k = 1;
int sum = 0;
int ok = 0;
for(int i = len-1; i >= flag+1; i--) //最后一个点之后也要判断,没有值或者字母或者溢出都要判断
{
if(len-flag > 4 || str[i] > 57) break;
sum += (str[i]-48)*k;
k = 10*k;
ok = 1;
}
if(sum <= 255&&sum >=0) count++;
if(count == 4 && ok) //一共四个点
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
真的是烦,很简单的一道题,还是多亏了discuss里面各位大神给出的测试数据了,跪了跪了