HDU 5059 Help him

题解:先判断第一个是否负号。如果是把第一个符号拿掉之后判断后面的长度是否<=12,并且是否数字,然后转化成数字看看是否在[a,b],注意-0这个数据。

如果不是判断长度是否<=12,并且是否数字,然后转化成数字看看是否在[a,b]。
#include <cstdio>

#include <cstring>

char s[150],ss[150];

int A,B;

long long a,b;

using namespace std;

int main(){

    while((gets(s)!=NULL)&&(~scanf("%d%d",&B,&A))){

        a=A,b=B;

        gets(ss);

        int l=strlen(s),flag=1;

        if(l>11||l==0){puts("NO");continue;}

        for(int i=1;i<l;i++)if(s[i]<'0'||s[i]>'9'){puts("NO");flag=0;break;}

        if(flag){

            int flag1=1;

            long long ans=0;

            if(l==1){

                if(s[0]<'0'||s[0]>'9'){puts("NO");continue;}

                int now=s[0]-'0';

                if(now>=b&&now<=a)puts("YES");else puts("NO");

                continue;

            }

            if(s[0]=='-')flag1=0;

            else if(s[0]<'0'||s[0]>'9'){puts("NO");continue;}

            if(flag1&&s[0]=='0'){puts("NO");continue;}

            if(!flag1&&s[1]=='0'){puts("NO");continue;}

            if(flag1)for(int i=0;i<l;i++)ans=ans*10LL+s[i]-'0';

            else{for(int i=1;i<l;i++)ans=ans*10LL+s[i]-'0';ans=-ans;}

            if(ans>=b&&ans<=a)puts("YES");else puts("NO");

        }

    }return 0;

}

//注意单个的符号和0,还有计算中超过了int的问题

你可能感兴趣的:(help)