#include<bits/stdc++.h>
using namespace std;
char s[1000005];
long double l,r,t,wsl,wsr,dr,dl,fu;
bool pd,big,lx,rx;
inline long long read(){
long long k=0,f=1;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-1;
for(;isdigit(c);c=getchar())
k=k*10+c-'0';
return k*f;
}
int main(){
dl=l=read(),dr=r=read();t=read();
if(l<0)
l=-l,dl=-dl,lx=true;
if(r<0)
r=-r,dr=-dr,rx=true;
while(dr)
dr/=10,wsr++;
while(dl)
dl/=10,wsl++;
while(t--){
cin>>s;
if(s[0]=='-'&&strlen(s)==1){
cout<<1<<endl;
continue;
}
pd=true;
big=false;
fu=0;
if(s[0]=='0'&&strlen(s)>1) pd=false;
if(s[0]=='-'&&s[1]=='0') pd=false;
if(s[0]<'0'&&s[0]>'9'&&s[0]!='-') pd=false;
for(int i=1;i<strlen(s);i++){
if(!pd) break;
if(s[i]<'0'||s[i]>'9'){
pd=false;
break;
}
}
if(!pd){
cout<<1<<endl;
continue;
}
if(rx){
if(s[0]!='-'){
cout<<2<<endl;
continue;
}
for(int i=1;i<strlen(s);i++){
fu=fu*10+(s[i]-'0');
if(fu>l||(strlen(s)-i-1>0&&i==wsl)||(strlen(s)-i-1>0&&fu>l/10)||(fu==l/10&&s[i+1]-'0'>fmod(l,10))) big=true;
}
if(fu<r){
big=true;
}
}else{
if(lx){
if(s[0]=='-'){
for(int i=1;i<strlen(s);i++){
fu=fu*10+(s[i]-'0');
if(fu>l||(strlen(s)-i-1>0&&i==wsl)||(strlen(s)-i-1>0&&fu>l/10)||(fu==l/10&&s[i+1]-'0'>fmod(l,10))) big=true;
}
}
if(s[0]!='-'){
for(int i=0;i<strlen(s);i++){
fu=fu*10+(s[i]-'0');
if(fu>r||(strlen(s)-i-1>0&&i==wsr)||(strlen(s)-i-1>0&&fu>r/10)||(fu==r/10&&s[i+1]-'0'>fmod(r,10))) big=true;
}
}
}
else{
if(s[0]=='-'){
cout<<2<<endl;
continue;
}
for(int i=0;i<strlen(s);i++){
fu=fu*10+(s[i]-'0');
if(fu>r||(strlen(s)-i-1>0&&i==wsr)||(strlen(s)-i-1>0&&fu>r/10)||(fu==r/10&&s[i+1]-'0'>fmod(r,10))){
big=true;
}
}
if(fu<l) big=true;
}
}
if(big){
cout<<2<<endl;
continue;
}
cout<<0<<endl;
}
}
/*
这里发表一下写题的感受吧
首先,这是一道模拟题,大佬们自然有他们独特的写法,然而我还是写一下我这种蒟蒻好理解的吧。
题目一开始就不很友好 ,我的快速读入在开始差点炸了,给我留下了深刻的印象。
然后开始说明我的写法了:
首先是对范围取绝对值,在取的时候记录其符号,取完绝对值就开始记录范围的位数,这对后来的边界判断埋下了伏笔
然后开始对是否合格进行判断, 判断 过程是这样的:首先判断其字符是否只有“-”号,并对“000”这种 加以特判
特判之后,若是它合格了,就可以进行下一步的判断了。
那么下一步, 就是对他有没有超出边界判断了,根据范围绝对值的正负,可以粗略的分为3类 :
第一类是右端点小于 0,由于右端点比左端点大,所以此时左端点也小于0,取绝对值后,左端点大于右端点
第二类是左端点小于 0,但右端点大于0,这种情况要对 这个数是否小于0加以判断
第三类是左端点大于0,此时按常规方法判断即可
然后就到判定方法了,我们假设这个范围的绝对值为x,那么,还有个数fu代表这个数逐位增加 后的数,那么只要逐渐进行比较,满足以下规则:
1:若是fu>x那么fu不在x范围之内
2:若是fu当时的位数与x相同,且还尚有位数没读入,那么fu不在x范围之内
3:若是fu大于x的少最后一位时,且还有位数没读入,那么fu不在x范围之内(此判断是x在数据范围边缘时的特判)
4:若是fu等于x的少最后一位时,且fu的后一位大于x的最后一位, 那么fu不在x范围之内(此判断是x在数据范围边缘时的特判)
*/
洛谷月赛总结
最新推荐文章于 2024-04-27 15:54:49 发布