洛谷月赛总结

#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在数据范围边缘时的特判) 
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值