题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5059
题目意思:就是输入一行不多于 100 的字符串(除了' ' 和 ' ' 的任意字符),问是否是合法的整数,如果是的话问是否在[a, b] 范围内,是则输出 YES,否则输出 NO
合法的整数:(1)非负整数:只有数字,没有前导0
(2)负数:负号后面只能跟着数字,负号前没有任何字符
首先这条题感觉不是出得太好,不过都是硬着头皮学人家做啦。反正一些很变态的数据可能还是过不了,但却AC的。
模拟题一般都是比较恶心的!!!
AC 代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 8 typedef __int64 LL; 9 10 inline int check(string s, int st) 11 { 12 int f = 0; // 初始化很重要! 13 for (int i = st; i < s.size(); i++) 14 { 15 f = 0; 16 if (s[i] < '0' || s[i] > '9') 17 break; 18 f = 1; 19 } 20 return f; 21 } 22 23 inline LL judge(string s, int sign, int st) 24 { 25 LL num = 0; 26 for (int i = st; i < s.size(); i++) 27 num = num * 10 + (s[i]-'0'); 28 num *= sign; 29 return num; 30 } 31 32 int main() 33 { 34 int a, b; 35 string s; 36 while (getline(cin, s)) 37 { 38 scanf("%d%d", &a, &b); 39 getchar(); 40 int flag = 0; 41 if (s[0] == '-') 42 flag = check(s, 1); 43 else 44 flag = check(s, 0); 45 // 特判0的几种情况 46 if (s[0] == '0' && s.size() != 1) 47 flag = 0; 48 if (s[0] == '0' && s.size() == 1) 49 flag = 1; 50 if (s[0] == '-' && s[1] == '0') 51 flag = 0; 52 if (!flag) 53 { 54 printf("NO "); 55 continue; 56 } 57 // 处理到这里之后就是合法整数了,之后从string转换成__int64 58 LL ans = 0; 59 if (s[0] == '-') 60 ans = judge(s, -1, 1); 61 else 62 ans = judge(s, 1, 0); 63 if (s.size() == 0 || s.size() >= 12 || ans < a || ans > b) // 有长度限制,不能超出区间 64 printf("NO "); 65 else 66 printf("YES "); 67 } 68 return 0; 69 }