题解 P5238 【整数校验器】

· · 题解

这是一道细节题,注意细节即可AC。

本蒟蒻看到题解中各位神仙用各种方法AC,却没有说到stringstream,特此补充stringstream的解法。

思路见代码注释,上代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline bool cmp(string x,string y){
    if(x.size()!=y.size())return x.size()>y.size();
    int l=x.size()|y.size();
    for(ri i=0;i<l;++i)
        if(x[i]!=y[i])
            return x[i]>y[i];
    return false;
}
/*  这个函数是用来判断 x>y(x>0,y>0) 或 x<y(x<0,y<0) 的,正好满足我们判断x是
    否在long long范围内的需求   */
int t;
long long k,l,r;
string ninf="-9223372036854775808",pinf="9223372036854775807",x;
//ninf为long long的最小值,pinf为long long的最大值
stringstream ss;
main(){
    ios::sync_with_stdio(0);//毫无卵用的优化
    cin.tie(0);
    cout.tie(0);
    cin>>l>>r>>t;
    while(t--){
        ss.clear();//解决stringstream的复用问题
        ss.str("");//解决stringstream的内存问题
        cin>>x; //输入x
        if(x=="-"||(x[0]==48&&x.size()>1)cout<<"1\n";
        /*  注意x不能仅为一个负号,本蒟蒻亲测,加上x=="-"后 30pts -> 100pts
            若x为0后面跟数字,也是不合法的    */
        else if(x[0]=='-'){
            //处理x为负数时的情况
            if(x[1]==48)cout<<"1\n";    
            //若x为负数,第一个数字是0,则x不合法
            else if(cmp(x,ninf))cout<<"2\n";    
            //若x不在long long范围内,则x必定小于l,因为l在long long范围内
            else{
                ss<<x;  //将x插入stringstream
                ss>>k;  //从stringstream中提取出的数赋值给k
                //其过程相当于将x转化为了long long类型,并赋值给了k
                cout<<(k<l||k>r?"2\n":"0\n");   //依题意输出
            }
        }
        else{
            //处理x为非负数时的情况
            if(cmp(x,pinf))cout<<"2\n";
            //若x不在long long范围内,则x必定大于r,因为r在long long范围内
            else{
                //此处同上
                ss<<x;
                ss>>k;
                cout<<(k<l||k>r?"2\n":"0\n");
            }
        }
    }
}