首页 > 代码库 > HDU 5059 Help him(简单模拟题)

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代码:

 1 #include<stdio.h> 2 #include<string.h> 3  4 typedef __int64 LL; 5  6 int main(){ 7     char str[102]; 8     LL a, b; 9     while(gets(str)){10         scanf("%I64d%I64d", &a, &b);11         bool flag = 0;12         int len = strlen(str);13         if(len == 0 || len >= 13){//如果长度大于13 如果长度为0 那么肯定是NO14             flag = 1;15         }16         LL num = 0;17         if(!flag){18             int i = 0;19             bool sign = 0;20             if(str[0] == -){//先判断第一个是‘-‘21                 sign = 1;22                 ++i;23             }24             for( ; i < len; ++i){25                 if(str[i] < 0 || 9 < str[i]){//非法的字符26                     flag = 1;27                     break;28                 }29                 if(!num && str[i] == 0 && len > 1){//判断前导030                     flag = 1;31                     break;32                 }33                 num = num * 10 + str[i] - 0;34             }35             if(!flag){//是否含有非法字符36                 if(sign && !num){//-0 考虑这种情况37                     flag = 1;38                 }else if(sign){//是负数39                     num = -num;40                 }41             }42         }43 44         if(!flag && a <= num && num <= b){45             puts("YES");46         }else{47             puts("NO");48         }49         getchar();//这里注意 因为用的事gets 所以要吃掉一个回车50     }51     return 0;52 }

 

HDU 5059 Help him(简单模拟题)