题解 P5238 【整数校验器】
出题人来水一篇题解。
首先这题是我半年前出的,当时还不懂 python 那一套姿势。
今天听说被放到月赛 T1 来了,重新看了一下,发现直接 python 就水过去了(用 str(int(a)) 即可判断原串格式是否合法,int(a) 直接和
l, r, T = map(int, input().split())
for i in range(T):
s = input()
if (s == "-"):
print(1)
continue
n = int(s)
if (str(n) != s):
print(1)
else:
if (n >= l and n <= r):
print(0)
else:
print(2)
以下是原题解:
按照题意模拟即可。
注意到格式不合法会有如下情况:
-
- -
-0\dots -
0\dots
特判掉不合法后,先根据位数判断是否在 long long 范围内(可能仍然会爆 long long,使用 unsigned long long 存储),然后再判断大小即可。
标程:
#include <cstdio>
#include <cstring>
using ll = long long;
using ull = unsigned long long;
const size_t maxL = (128 << 10) + 5;
ll L, R;
int T;
char X[maxL];
void Judge()
{
int l = strlen(X + 1);
if(X[1] == '-') {
if(l == 1 || X[2] == '0') {
puts("1");
return;
}
} else if(X[1] == '0' && l != 1) {
puts("1");
return;
}
if(X[1] == '-' && l > 20) {
puts("2");
return;
}
if(X[1] != '-' && l > 19) {
puts("2");
return;
}
ull tmp;
ll x;
if(X[1] == '-') {
sscanf(X + 2, "%llu", &tmp);
if(tmp > 1ULL << 63) {
puts("2");
return;
}
x = -tmp;
} else {
sscanf(X + 1, "%llu", &tmp);
if(tmp >= 1ULL << 63) {
puts("2");
return;
}
x = tmp;
}
puts(x >= L && x <= R ? "0" : "2");
}
int main()
{
for(scanf("%lld%lld%d", &L, &R, &T); T--; ) {
scanf("%s", X + 1);
Judge();
}
return 0;
}