HDU 5059 Help him(简单模拟题)

时间:2023-03-09 18:50:26
HDU 5059 Help him(简单模拟题)

http://acm.hdu.edu.cn/showproblem.php?pid=5059

题目大意:

  给定一个字符串,如果这个字符串是一个整数,并且这个整数在[a,b]的范围之内(包括a,b),那就输出YES,其它的都是NO。

这个字符串是整数的条件:

1、如果它是正整数,它只包含前导不是0的数(这个数前面没有零)。

2、如果它是负整数,只包含一个'-'符号,任然没有前导0。

3、除此之外都不是非法的

解题思路:

http://bestcoder.hdu.edu.cn/ 这里有

要注意:

00

01

-

-0

-01

1 2

这些都是非法的

我一直错,原因是我没有考虑给定整数的大小。

它给定的字符串的长度不超过100。但是ab的范围是[-10^9,10^9],所以如果字符串长度超过10位,就一定是NO。

可是我当我把长度改10,11时都是wrong,改成13就对了。结题报告是12位。可能是它测试数据超过了10^9,总之按他解题报告,坑定能A的。

AC代码:

 #include<stdio.h>
#include<string.h> typedef __int64 LL; int main(){
char str[];
LL a, b;
while(gets(str)){
scanf("%I64d%I64d", &a, &b);
bool flag = ;
int len = strlen(str);
if(len == || len >= ){//如果长度大于13 如果长度为0 那么肯定是NO
flag = ;
}
LL num = ;
if(!flag){
int i = ;
bool sign = ;
if(str[] == '-'){//先判断第一个是'-'
sign = ;
++i;
}
for( ; i < len; ++i){
if(str[i] < '' || '' < str[i]){//非法的字符
flag = ;
break;
}
if(!num && str[i] == '' && len > ){//判断前导0
flag = ;
break;
}
num = num * + str[i] - '';
}
if(!flag){//是否含有非法字符
if(sign && !num){//-0 考虑这种情况
flag = ;
}else if(sign){//是负数
num = -num;
}
}
} if(!flag && a <= num && num <= b){
puts("YES");
}else{
puts("NO");
}
getchar();//这里注意 因为用的事gets 所以要吃掉一个回车
}
return ;
}