杭电ACM 2054:A == B ?

来源:互联网 发布:淘宝儿童女装14岁 编辑:程序博客网 时间:2024/05/01 10:20

原创作品 转载请注明出处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;}
0 0
原创粉丝点击