hdu 5059 BC#12 Help him

本文探讨了如何通过简单模拟来解决给定字符串判断其表示的数字是否位于两个整数之间的编程问题。详细介绍了字符串中可能存在的非法字符与表达方式,并分享了避免常见错误的方法,如忽略空格和正确处理前导零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

呃啊。。。。这也是醉了。。

题意很简单  就是给一行字符串 给两个整数  判断字符串所表示的数字在不在两个整数之间

字符串里面有一些非法字符  还有一些非法的表达方式  比如前导0 

直接简单模拟就可以的。。。因为两个整数是有范围的  在int范围之内 所以可以通过字符串的长度进行判断

一开始我在写的时候 没注意到会出现空格的情况  用的scanf读取 WA了之后发现不对 用gets读取

然后还是始终不对 各个特殊情况都考虑到了。。

再我准备再重新写的时候 把读取两个整数之后的\n删了 在之后加上getchar()之后  提交 过了!!

尼玛啊。。简直瞎了  以后再也不要这么写了。。。。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>

#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  100100
#define INF 0x7fffffff

#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define FOV(i,a,b)  for(int i=a;i>=b;i--)
#define REP(i,a,b)  for(int i=a;i<b;i++)
#define REV(i,a,b)  for(int i=a-1;i>=b;i--)
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll __int64

using namespace std;

char s[200];

int main()
{
//freopen("ceshi.txt","r",stdin);
    while(gets(s))
    {
//        cout<<s<<endl;
        ll a,b;
        scanf("%I64d %I64d",&a,&b);
        getchar();
        int len=strlen(s);
        if(len>11||len==0)
        {
            puts("NO");
            continue;
        }
        int flag=1;
        for(int i=0;i<len&&flag;i++)
        {
            if(i==0&&s[0]=='-')
                continue;
            if(s[i]<'0'||s[i]>'9')
            {
                flag=0;
                break;
            }
        }
        if(flag==0)
        {
            puts("NO");
            continue;
        }
        ll c=0;
        ll time=1;
        if(s[0]=='-')
        {
            if(s[1]=='0')
            {
                puts("NO");
                continue;
            }
            else
            {
                if(len==1)
                {
                    puts("NO");
                    continue;
                }
                else
                {
                    for(int i=len-1;i>=1;i--)
                    {
                        c+=(s[i]-'0')*time;
                        time*=10;
                    }
                    c*=-1;
//                    cout<<c<<endl;
                    if(c>=a&&c<=b)
                    {
                        puts("YES");
                        continue;
                    }
                    else
                    {
                        puts("NO");
                        continue;
                    }
                }
            }
        }
        else
        {
            if(s[0]=='0'&&len>1)
            {
                puts("NO");
                continue;
            }
            else
            {
                for(int i=len-1; i>=0; i--)
                {
                    c+=(s[i]-'0')*time;
                    time*=10;
                }
//                 cout<<c<<endl;
                if(c>=a&&c<=b)
                {
                    puts("YES");
                    continue;
                }
                else
                {
                    puts("NO");
                    continue;
                }
            }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值