杭电ACM 2054:A == B ?

原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45556755

这里写图片描述

尼玛,这道题刚看的时候觉得太简单了,一会写了几行判断相等的代码,而且直接用a==b判断,提交时候就傻逼了,怎么也AC不了。原来这一道题确实是有点难度的,主要是在输入的数字中不一定是规则的数字,所以要考虑的情况有好几种。主要是考虑小数中末尾的0,如5.0和5.00是相等的数,所以输入的数据类型最好定义成字符串,然后在比较两个数前先把末尾的0去掉。另外,题目上没给具体的数值类型,所以要开一个很大的字符数组。
1)前面的无效0去掉

2)小数点后面的无效0去掉

3)-0=0

4)可以去掉的话,最好去掉小数点

我的代码如下:

#include <iostream>
#include<string.h>
using namespace std;

//对数字进行统一处理,返回数字第一位不为0的位置
int change_char(char *letter,int *len)
{
    int i=0;
    int len_var=(*len)-1;
    //如果是符号,则跳过
    if(letter[i]=='-')
    {
        ++i;
        --(*len);
    }
    //去掉前面的0
    while(letter[i]=='0'&&i<=len_var)
    {
        --(*len);
        ++i;
    }
    //去掉小数点之后最后无效的0,从最后一位算起
    for(int j=0; j<=len_var; j++)
    {
        if(letter[j]=='.')
        {
            while(letter[len_var]=='0'&&len_var>=0)
            {
                --(*len);
                --len_var;
            }

            break;
        }
    }

    //如果小数点后面都是无效的0.则去掉小数点
    if(letter[len_var]=='.')
        --(*len);

    return i;
}

int main()
{
    char a[100000],b[100000];
    int symbol_flag,lenght_a,lenght_b,pos_char_a,pos_char_b,out_flag=1;

    while(cin>>a>>b)
    {
        /*当两者符号不一样的时候做一个标志,
        因为存在-0=0这种情况,所以当符号不一样不能直接下定论两者不相等
        */
        if(a[0]=='-'&&b[0]!='-' || a[0]!='-'&&b[0]=='-')
            symbol_flag=1;
        //求出a,b长度
        lenght_a=strlen(a);
        lenght_b=strlen(b);
        //求出第一位不为0的数的位置
        pos_char_a= change_char(a,&lenght_a);
        pos_char_b= change_char(b,&lenght_b);
        //当两者的有效位数不一样直接是不相等,注意下面几个continue的作用
        if(lenght_a!=lenght_b)
        {
            cout<<"NO"<<endl;
            continue;
        }
        //以下几个语句都是在lenght_a=lenght_b才执行的
        if(symbol_flag==1&&lenght_a==0)
        {
            cout<<"YES"<<endl;
            continue;
        }
        //当符号不一样,且lenght_a或者lenght_b都不为0时候是不相等的
        if(symbol_flag==1)
        {
            cout<<"NO"<<endl;
            continue;
        }
        //当符号一样,长度相等执行下面语句,从有效长度起始位置开始判断各位是否相等
        for(int i=pos_char_a,j=pos_char_b; i<lenght_a; i++,j++)
        {
            if(a[i]!=b[j])
            {
                cout<<"NO"<<endl;
                out_flag=0;
                break;
            }


        }

        if(out_flag==1)
            cout<<"YES"<<endl;
        //从新初始化
        out_flag=1;

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值