模拟,可以分成两部分:
1.是否合法
2.是否在范围内
做法思路很简单
1:排除两个不合法形式即可:开头为0的只能有1位,不能是单个的 ‘ - ’ 。
2:也好想,题中给出的最大范围是long long 上限,超long long的直接输2continue,剩下的转成数的形式比较一下。
问题在于做部分1时,数据是字符串形式,怎么把它转成整形并判断是否爆long long写着有点麻烦,蒟蒻还没学过字符串基础的我果然没敲完这部分。根据计算器结果(滑稽)2^64有20位,再判定下有无负号可以排除爆long long位数的部分。
至于剩下的怎么转成整型,cz大佬题解里给了个黑科技——sstream库里的ssanf:sscanf(ch+2,"%llu",&tmp);//从字符串的第二位开始读,把后面的所有数字转换为一个unsigned long long类型变量tmp后再进行处理。
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <sstream>
using namespace std;
long long l,r;
int t;
char s[1000005];
int main()
{
cin>>l>>r>>t;
while (t--)
{
cin>>(s+1);
int len=strlen(s+1);
if(s[1]=='-')
{
if(s[2]=='0'||len==1)
{
cout<<"1"<<endl;
continue;
}
}
if(s[1]=='0'&&len!=1)
{
cout<<"1"<<endl;
continue;
}
if (s[1]=='-'&&len>20)
{
puts("2");
continue;
}
if (s[1]!='-'&&len>19)
{
puts("2");
continue;
}
unsigned long long tmp=0;
long long x=0;
if(s[1]=='-')
{
sscanf(s+2,"%llu",&tmp);
if (tmp>(1LL<<63))
{
puts("2");
continue;
}
x=-tmp;
}
else
{
sscanf(s+1,"%llu",&tmp);
if (tmp>=(1LL<<63))
{
puts("2");
continue;
}
x=tmp;
}
puts(x>=l && x<=r?"0":"2");
}
return 0;
}