hdu 2054-A == B ?

题目及代码:

       以字符串的形式给出A和B,判断A和B的数值是否相等。

       没什么事,也就来看看以前没做出来的题目。这是大一的时候留下的题目了,当时怎么做都不对,后来才知道,直接想的太简单了,后来就放弃了。

       现在可能这道题目,就知道是一道比较恶心的模拟题目了。

      思路就是用两个栈分别来存两个数,当然需要有一下要注意的地方:

      1.‘+’和‘-’的处理:如果这个数是第一个字符是‘-’,那么就要压栈‘-’,否则无论这个数的第一个字符是不是‘+’,都要压栈‘+’(这样方便比较);

      2.去掉前导0,这里需要注意一下如果是形如‘0000’或者‘0000.0001’的数,这里记得要留一个‘0’压栈(具体处理看代码);

      3.后导0的处理,也都要去掉,注意一下形如‘0000.000’的情况,也就是说去掉后导0后还剩下一个‘.’这是我们不想看见的;

      4.还有就是-0和+0的比较


#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
char s[111111];

stack<char> l,r;

void solve(char s[],stack<char> &nt)
{
    bool flag=false;//记录是否有小数点
    char vt;
    int len=strlen(s),i=0;
    //看正负,压栈'-'或者'+'
    if(s[i]=='-')
    {
        nt.push(s[i]);
        i++;
    }
    else if(s[i]=='+')
    {
        nt.push(s[i]);
        i++;
    }
    else nt.push('+');
    //去掉前导0
    for(;i<len-1&&s[i]=='0';i++);
    //压栈剩下的数字
    for(;i<len;i++)
    {
        if(s[i]=='.')
        {
            //防止去掉前导0后出现整数部分不存在的情况
            if(nt.top()=='-'||nt.top()=='+') nt.push('0');
            flag=true;
        }
        nt.push(s[i]);
    }

    if(flag)   //存在小数点,那么我们就要进行后导0的去除
    while(!nt.empty())
    {
        vt=nt.top();
        if(vt!='0')
        {
            break;
        }
        nt.pop();
    }
    //小数部分为0,去掉'.'
    if(vt=='.') nt.pop();
}
int main()
{
    while(scanf("%s",s)!=EOF)
    {
        while(!l.empty())
        {
            l.pop();
        }
        while(!r.empty())
        {
            r.pop();
        }

        solve(s,l);
        scanf("%s",s);
        solve(s,r);

        bool flag=true,flag_0=true;//flag判断是否两个数相等,flag_0判断是否比较过的数字都是0
        while(!l.empty()&&!r.empty())
        {
            //printf("%c %c\n",l.top(),r.top());
            if(l.top()!=r.top())
            {
                flag=false;
                break;
            }
            if(l.top()!='0') flag_0=false;
            l.pop();r.pop();
        }
        if(!l.empty()||!r.empty())
        {
            flag=false;
        }
        if(flag_0&&(l.top()=='-'||l.top()=='+')&&(r.top()=='-'||r.top()=='+'))
        {
            //如果比较过的数字都是0,并且最后比较的是符号位,那么这两个数都是0
            printf("YES\n");
        }
        else
        {
            printf("%s\n",flag?"YES":"NO");
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值