5238-整数校验器-洛谷3月赛gg祭

 

传送门

题目描述

有些时候需要解决这样一类问题:判断一个数 x是否合法。

x合法当且仅当其满足如下条件:

  • x格式合法,一个格式合法的整数要么是 0,要么由一个可加可不加的负号,一个 19 之间的数字,和若干个 0 到 9 之间的数字依次连接而成。
  • x在区间 [l,r] 范围内(即 l≤x≤r)。

你需要实现这样一个校验器,对于给定的 l,r,多次判断 x是否合法。

输入输出格式

输入格式:

 

第一行三个整数 l,r,T,表示校验器的校验区间为 [l,r]以及需要校验的 x 的个数。

接下来 T行,每行一个 x,表示要校验的数,保证 x长度至少为 1且仅由 '0'~'9' 及 '-' 构成,且 '-' 只会出现在第一个字符。

 

输出格式:

 

输出共 T 行,每行一个整数,表示每个 xx 的校验结果。

校验结果规定如下:0表示 x 合法;1 表示 x 格式不合法;2 表示 x 格式合法且不在 [l,r] 区间内。

 

输入输出样例

输入样例#1: 复制
-3 3 4
0
00
-0
100000000000000000000
输出样例#1: 复制
0
1
1
2

说明

对于 100% 的数据,0T512,l,r64 位有符号整型范围内

保证输入文件大小不超过 128KB。数据在 linux 下生成,没有 '\r' 字符。

以下为部分特殊限制(互不包含):

  • 5%的数据,T=0
  • 25%的数据,保证 x 格式一定合法。
  • 30% 的数据,保证如果 x 格式合法,那么 x 一定在 64 位有符号整形范围内。

---------------------------------------------------------------------------------------------------------------------------------------------------

 这是一道很简单很简单很简单的模拟

只是要注意到的点有很多

(我真的真的都注意到了

但是由于dr太弱太弱了

(尤其是代码能力和debug精神)

于是dr就写乱了

啊啊啊啊啊啊

5分gg

(dr第一次参加乐多赛,不懂规则,提交多了,还扣了几分,就更可怜了)

注意注意注意啦!!!!!!

码风要好!!!!

不能太慌张!!!

多读题!!!!!

先理好思路在写!

多刷题!!!!!

-----------------------------------------------------------------------------------------------------------------

#include<bits/stdc++.h> 
using namespace std;

typedef long long ll;
ll l,r;
int t;

inline int read()
{
    int sum = 0,p = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
            p = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        sum = sum * 10 + ch - '0';
        ch = getchar();
    }
    return p * sum;
}

int main()
{
    scanf("%lld%lld",&l,&r);
    t = read();
    while(t--)
    {
        char qwq[1005];
        cin>>(qwq + 1);
        int len = strlen(qwq+1);
        if(qwq[1] == '-')
        {
            if(qwq[2] == '0' ||len == 1)
            {
                printf("1\n");
                continue;
            }
        }
        if(qwq[1] == '0' && len != 1)
        {
            printf("1\n");
            continue;
        }
        if(qwq[1] == '-' && len > 20)
        {
            printf("2\n");
            continue;
        }
        if(qwq[1] != '-' && len > 19)
        {
            printf("2\n");
            continue;
        }
        
        unsigned long long ans = 0;
        ll cnt = 0;
        if(qwq[1] == '-')
        {
            sscanf(qwq+2,"%llu",&ans);//从字符串的第二位开始读,把后面的所有数字转换为一个unsigned long long类型变量tmp后再进行处理。
            if(ans > (1LL<<63))
            {
                
                printf("2\n");
                continue;
            }
            cnt=-ans;
        }
        else
        {
            sscanf(qwq+1,"%llu",&ans);
            if (ans>=(1LL<<63))
            {
                printf("2\n");
                continue;
            }
            cnt=ans;
        }
        puts(cnt>=l && cnt<=r?"0":"2");
        
    }
    return 0;
} 

用一下sstream里面的sscanf可以帮助简化代码

 
posted @ 2019-03-02 21:28  darrrr  阅读(202)  评论(0编辑  收藏  举报