Noble 的博客

Noble 的博客

♡虹蓝♡

题解 P5238 【整数校验器】

posted on 2019-03-02 20:30:46 | under 题解 |

就是一道模拟题啦。

如果不从字符串处理思考,当成大整数写可能有助于想全不合法的情况。

不合法的情况有三种:

  1. 前导零。
  2. -0(样例明示)
  3. 单独的‘-’号。(个人认为显而易见,但是机房里有不少人都忘了这事)

判断完合法之后,判断范围就行了。

应该可以通过判断数字是不是在long long的位数范围内,然后就用atol函数转成long long,和l,r比较或者输出2就行了。(不过可能会被卡,要是和long long max高精比较又失去了这个做法的简单优势)

也可以我这样直接把l,r用高精度盘一下,然后高精度比较大小。

没有四则运算,所以正着存倒着存都行。 (虽然我倒着处理的,但是一开始是正着存的,em...)。

代码应该可以自解释。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class bigint
{
    public:
        string str;
        bool tag;
        bigint(string _str,bool _tag)
        {
            str=_str;
            reverse(str.begin(),str.end());
            tag=_tag;
        }
        bigint(string _str)
        {
            if(_str.size()==0){
                str.clear();
                return;
            }
            if(_str[0]=='-')
            {
                tag=true;
                str=_str.substr(1,_str.size());
            }
            else
            {
                tag=false;
                str=_str;
            }
            reverse(str.begin(),str.end());
        }
        bigint()
        {
            tag=false;
        }
        const bigint operator=(string _str)
        {
            if(_str.size()==0){
                str.clear();
                return *this;
            }
            if(_str[0]=='-')
            {
                tag=true;
                str=_str.substr(1,_str.size());
            }
            else
            {
                tag=false;
                str=_str;
            }
            reverse(str.begin(),str.end());
        //  cout<<"=    "<<_str<<"  "<<str<<endl;
            return *this;
        }
        const bool operator==(const bigint& b)
        {
            return tag==b.tag&&str==b.str;
        }
        const bool abs_smaller(const bigint& b)
        {
            int as=str.size();
            int bs=b.str.size();
            if(as==bs)
            {
                for(register int i=as;i>=0;--i)
                {
                    if(str[i]!=b.str[i])//different number
                    {
                        return str[i]<b.str[i];
                    }
                }
                return false;
            }
            else
                return as<bs;
        }
        const bool operator<(const bigint& b)
        {
            if(tag==true)//this<0
            {
                if(b.tag==false)//b>=0
                    return true;
                else
                    return !abs_smaller(b);
            }
            else//this>=0
            {
                if(b.tag==true)//b<0
                    return false;
                else
                    return abs_smaller(b);
            }
        }
        const bool operator>(const bigint& b)
        {
            //when a>b,a<b==false&&a==b==false;
            return !(*this<b||*this==b);
        }
};
const bool check(string& str)
{
//  cout<<"check"<<str.size()<<endl;
    if(str.size()==1)
        return !(str[0]=='-');
    else{
        return !(str[0]=='-'&&str[1]=='0'||str[0]=='0');
    }
}
string sl,sr;
bigint i,l,r;
int T;
void output()
{
    cout<<"ooutput"<<endl;
    for(register int i=0;i<l.str.size();++i)
        cout<<l.str[i];
    cout<<" "<<l.tag<<endl;
    for(register int i=0;i<r.str.size();++i)
        cout<<r.str[i];
    cout<<" "<<r.tag<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    string str;
    cin>>sl>>sr>>T;
    l=sl;
//  cout<<"L"<<endl;
    r=sr;
//  cout<<"R"<<endl;
//  output();
    while(T--)
    {
        cin>>str;
        if(check(str))//str is ok 
        {
        //  cout<<"ok   "<<str<<endl;
            i=str;
            if((l<i||l==i)&&(i<r||i==r))
                cout<<0<<endl;
            else
                cout<<2<<endl;
        }
        else
        {
        //  cout<<"not ok"<<endl;
            cout<<1<<endl;
        }
    }
    /*cin>>T;
    while(T--)
    {
        cin>>sl>>sr;
        l=sl;
        r=sr;
        cout<<(l<r)<<endl;
    */
    return 0;
}

std::string nb!