题解 P5238 【整数校验器】

· · 题解

我赌我代码绝对是C++里面最短的——之一……

其实很简单,就是个比较。于是我们就可以用long~double,毕竟long~double的值域高达10^{1050+}……

int main(){
    cin >> L >> R >> T ;
    while(T --){
        scanf("%s", In), Len = strlen(In) ;
        if ((In[0] == '-' && In[1] == '0') || (In[0] == '0' && Len > 1) || (Len == 1 && In[0] == '-')) puts("1") ;
        else if (Len > 30) puts("2") ;
        else {
            long double N = 0 ;
            if (In[0] == '-'){
                for (i = 1 ; i < Len ; ++ i) N = N * 10 + (In[i] - '0') ;
                N *= -1.0 ;
            }
            else 
                for (i = 0 ; i < Len ; ++ i) N = N * 10 + (In[i] - '0') ;
            if (N >= L && N <= R) puts("0") ; else puts("2") ;
        }
    }
    return 0 ;
}

然后因为2^{64}大概在1e19左右,超过长度可以直接判掉。