首页 > 其他 > 详细

luogu3月月赛1 整数校验器

时间:2019-03-02 21:46:58      阅读:169      评论:0      收藏:0      [点我收藏+]

铁炉堡传送门


 

模拟,可以分成两部分:

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

 

luogu3月月赛1 整数校验器

原文:https://www.cnblogs.com/charlesss/p/10463073.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!