天天看点

杭电OJ 2054 A == B ?

杭电OJ 2054 A == B ?

第一眼看到这题,就觉得应该没那么简单,肯定有坑,但我还是忍不住去试了试直接判断相等,结果可想而知------WA了。

然后我就自做聪明的用了字符串,也就字符数组,先用memset函数将数组清零,然后再读入数据。。。。

请看错误代码:

杭电OJ 2054 A == B ?

但是我忽略了一个问题,那就是\0,读入后末尾会变成‘\0’。而且还有一个需要注意的地方,就是strcmp()这个函数遇到/0就结束比较了。

以上就是我踩的坑,下面讲下我AC的思路:

   总体思路:判断是否有小数点,没有就加上小数点,再判断字符串长度是否相等,不相等的话就在短的那个后面加\'0\',直到长度相等位置。

   第一点:毫无疑问,这题没有范围,所以数据是可以很大的(可正可负),所以我们应该用字符串

   第二点:精度问题肯定要考虑,比如1.0  1.00 1.00之类的

   第三点:还可能是有无小数点  比如1  1.0 1.00

先附上C++代码,简单明了。

#include<iostream>
using namespace std;
int main()
{
    string a, b;
    while(cin>>a>>b)
    {
        if(a == b)
        {
            cout<<"YES"<<endl;
        }
        else
        {
            bool ans = false;
            if(a.length() < b.length())
            {
                for(string::iterator i = a.begin(); i != a.end(); i++)
                {
                    if(*i == \'.\')
                    {
                        ans = true;
                    }
                }

                if(!ans)
                {
                    a+=".";
                }

                while(a.length()!=b.length())
                {
                    a += "0";
                }
            }
            else if(a.length()>b.length())
            {
                for(string::iterator i = b.begin(); i != b.end(); i++)
                {
                    if(*i==\'.\')
                    {
                        ans = true;
                    }

                }

                if(!ans)
                {
                    b+=".";
                }

                while(a.length()!=b.length())
                {
                    b += "0";
                }
            }

            if(a==b)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}
           

然后我又跟着这个思路用C写了一下

#include <cstdio>
#include <cstring>
#define MAX 1000005
char a[MAX], b[MAX];
int main()
{
    while(~scanf("%s%s", a, b))
    {
        int len_a = strlen(a);
        int len_b = strlen(b);
        bool ans_a = true;
        bool ans_b = true;


        if(len_a != len_b)
        {
            for(int i = 0; i < len_a; i++)
            {
                if(a[i] == \'.\')
                {
                    ans_a = false;
                }
            }

            if(ans_a)
            {
                a[len_a] = \'.\';
            }

            for(int i = 0; i < len_b; i++)
            {
                if(b[i] == \'.\')
                {
                    ans_b = false;
                }
            }

            if(ans_b)
            {
                b[len_b] = \'.\';
            }


            if(strlen(a) < strlen(b))
            {
                if(ans_a)
                {
                    for(int i = len_a + 1; i < strlen(b); i++)
                    {
                        a[i] = \'0\';
                    }
                }
                else
                {
                    for(int i = len_a; i < strlen(b); i++)
                    {
                        a[i] = \'0\';
                    }
                }

            }

            if(strlen(a) > strlen(b))
            {
                if(ans_b)
                {
                    for(int i = len_b + 1; i < strlen(a); i++)
                    {
                        b[i] = \'0\';
                    }
                }
                else
                {
                    for(int i = len_b; i < strlen(a); i++)
                    {
                        b[i] = \'0\';
                    }
                }

            }
        }


        if(strcmp(a, b) == 0)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}           

C实在是太不方便了,ACM主流也是C++,我正在慢慢从C到C++转化。