题解 P5238 【整数校验器】

· · 题解

出题人来水一篇题解。

首先这题是我半年前出的,当时还不懂 python 那一套姿势。

今天听说被放到月赛 T1 来了,重新看了一下,发现直接 python 就水过去了(用 str(int(a)) 即可判断原串格式是否合法,int(a) 直接和 l,r 比较大小就行了)。

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)

以下是原题解:

按照题意模拟即可。

注意到格式不合法会有如下情况:

特判掉不合法后,先根据位数判断是否在 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;
}