1. 程式人生 > >杭電OJ 2054 A == B ?

杭電OJ 2054 A == B ?

第一眼看到這題,就覺得應該沒那麼簡單,肯定有坑,但我還是忍不住去試了試直接判斷相等,結果可想而知------WA了。

然後我就自做聰明的用了字串,也就字元陣列,先用memset函式將陣列清零,然後再讀入資料。。。。

請看錯誤程式碼:

但是我忽略了一個問題,那就是\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++轉化。