题解 P5238 【整数校验器】

_虹_

2019-03-02 20:30:46

Solution

就是一道模拟题啦。 如果不从字符串处理思考,当成大整数写可能有助于想全不合法的情况。 不合法的情况有三种: 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!