题解 P5238 【整数校验器】
_虹_
2019-03-02 20:30:46
就是一道模拟题啦。
如果不从字符串处理思考,当成大整数写可能有助于想全不合法的情况。
不合法的情况有三种:
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!