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 那么肯定是NO
14             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){//判断前导0
30                     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 }
原文地址:https://www.cnblogs.com/xuqiulin/p/4010363.html