luogu3月月赛T1 整数校验器

铁炉堡传送门


 

模拟,可以分成两部分:

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;
}

 

posted @ 2019-03-02 21:34  .Terena  阅读(184)  评论(0)    收藏  举报