题目描述
有些时候需要解决这样一类问题:判断一个数 x是否合法。
x合法当且仅当其满足如下条件:
- x格式合法,一个格式合法的整数要么是 0,要么由一个可加可不加的负号,一个 1到 9 之间的数字,和若干个 0 到 9 之间的数字依次连接而成。
- x在区间 [l,r] 范围内(即 l≤x≤r)。
你需要实现这样一个校验器,对于给定的 l,r,多次判断 x是否合法。
输入输出格式
输入格式:
第一行三个整数 l,r,T,表示校验器的校验区间为 [l,r]以及需要校验的 x 的个数。
接下来 T行,每行一个 x,表示要校验的数,保证 x长度至少为 1且仅由 '0'~'9' 及 '-' 构成,且 '-' 只会出现在第一个字符。
输出格式:
输出共 T 行,每行一个整数,表示每个 xx 的校验结果。
校验结果规定如下:0表示 x 合法;1 表示 x 格式不合法;2 表示 x 格式合法且不在 [l,r] 区间内。
输入输出样例
-3 3 4000-0100000000000000000000
0112
说明
对于 100% 的数据,0≤T≤512,l,r 在 64 位有符号整型范围内
保证输入文件大小不超过 128KB。数据在 linux 下生成,没有 '\r' 字符。
以下为部分特殊限制(互不包含):
- 有 5%的数据,T=0。
- 有 25%的数据,保证 x 格式一定合法。
- 有 30% 的数据,保证如果 x 格式合法,那么 x 一定在 64 位有符号整形范围内。
---------------------------------------------------------------------------------------------------------------------------------------------------
这是一道很简单很简单很简单的模拟
只是要注意到的点有很多
(我真的真的都注意到了)
但是由于dr太弱太弱了
(尤其是代码能力和debug精神)
于是dr就写乱了
啊啊啊啊啊啊
5分gg
(dr第一次参加乐多赛,不懂规则,提交多了,还扣了几分,就更可怜了)
注意注意注意啦!!!!!!
码风要好!!!!不能太慌张!!!
多读题!!!!!
先理好思路在写!
多刷题!!!!!
-----------------------------------------------------------------------------------------------------------------
#includeusing namespace std;typedef long long ll;ll l,r;int t;inline int read(){ int sum = 0,p = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') p = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { sum = sum * 10 + ch - '0'; ch = getchar(); } return p * sum;}int main(){ scanf("%lld%lld",&l,&r); t = read(); while(t--) { char qwq[1005]; cin>>(qwq + 1); int len = strlen(qwq+1); if(qwq[1] == '-') { if(qwq[2] == '0' ||len == 1) { printf("1\n"); continue; } } if(qwq[1] == '0' && len != 1) { printf("1\n"); continue; } if(qwq[1] == '-' && len > 20) { printf("2\n"); continue; } if(qwq[1] != '-' && len > 19) { printf("2\n"); continue; } unsigned long long ans = 0; ll cnt = 0; if(qwq[1] == '-') { sscanf(qwq+2,"%llu",&ans);//从字符串的第二位开始读,把后面的所有数字转换为一个unsigned long long类型变量tmp后再进行处理。 if(ans > (1LL<<63)) { printf("2\n"); continue; } cnt=-ans; } else { sscanf(qwq+1,"%llu",&ans); if (ans>=(1LL<<63)) { printf("2\n"); continue; } cnt=ans; } puts(cnt>=l && cnt<=r?"0":"2"); } return 0;}
用一下sstream
里面的sscanf
可以帮助简化代码