题解 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");
}
}
}
}