BFS:HDU2054-A==B?(字符串的比较)

来源:互联网 发布:html javascript怎么用 编辑:程序博客网 时间:2024/06/06 01:47

                                                                                                          A == B ?

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 64960    Accepted Submission(s): 10164


Problem Description
Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO".
 

Input
each test case contains two numbers A and B.
 

Output
for each case, if A is equal to B, you should print "YES", or print "NO".
 

Sample Input
1 22 23 34 3
 

Sample Output
NOYESYESNO




解题心得:
1、这个题很水,不要想得太简单也不要想得太难。就是用数字的规则比较两个字符串是否相等,但是会有小数,还有后导0。
2、其实写这种水题比较考验思维,思维混乱的,写得乱七八糟,要冷静地去思考,考虑是否可以使用stl解决。如果不可以再手动比较,手动比较的时候理清楚思维,不要写得一团乱麻,程序员不要太勤劳,用代码去硬怼题,越写越乱在后面找bug的时候就要炸了。思维清晰,分部分分功能去写。



调用stl(strcmp)的代码:
//使用strcmp,只需要将小数点后面的字符0改为数字0,就可以全部解决了#include<bits/stdc++.h>using namespace std;const int maxn = 1e5;char a[maxn],b[maxn];bool check_pointa(){    for(int i=0; i<maxn ;i++)        if(a[i] == '.')            return true;    return false;}bool check_pointb(){    for(int i=0; i<maxn ;i++)        if(b[i] == '.')            return true;    return false;}int main(){    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    while(scanf("%s%s",a,b)!=EOF)    {        bool flaga = false,flagb = false;        //检查是否有小数点,有小数点将小数点后面无用的字符0化为数字0方便后面的比较        flaga = check_pointa();        flagb = check_pointb();                if(flaga)        {            for(int i=maxn-1;i>=0;i--)            {                if(a[i]=='0' || a[i] ==0)                    a[i] = 0;                else                {                    if(a[i] == '.')                        a[i] = 0;                    break;                }            }        }                if(flagb)        {            for(int i=maxn-1;i>=0;i--)            {                if(b[i]=='0' || b[i] ==0)                    b[i] = 0;                else                {                    if(b[i] == '.')                        b[i] = 0;                    break;                }            }        }        if(strcmp(a,b) == 0)//直接比较,因为已经将字符0改为了数字0,前导0也就不用管了            printf("YES\n");        else            printf("NO\n");        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));    }    return 0;}



手动比较的代码:(这个玩意儿复杂死了,都不知道当时自己为什么这么勤快居然老老实实写完了)
#include<bits/stdc++.h>using namespace std;const int maxn = 1e5;char a[maxn],b[maxn];int lena,lenb;int posa,posb;void cmp1(){    if(lena != lenb)//数位不等直接返回    {        printf("NO\n");        return ;    }        for(int i=0; i<lena; i++)//数位相等直接比较        if(a[i] != b[i])        {            printf("NO\n");            return;        }    printf("YES\n");}void cmp2(){    if(posb != lena)//b的整数数位比a大,直接返回    {        printf("NO\n");        return;    }        for(int i=posb+1; i<lenb; i++)//因为a是整数,只要b的小数部分不全为0直接返回    {        if(b[i] != '0')        {            printf("NO\n");            return ;        }    }        for(int i=0; i<posb; i++)//b小数部分为0,整数数位相等,逐位比较就好        if(a[i] != b[i])        {            printf("NO\n");            return;        }            printf("YES\n");}void cmp3(){    //和cmp2差不多    if(posa != lenb)    {        printf("NO\n");        return;    }    for(int i=posa+1; i<lena; i++)    {        if(a[i] != '0')        {            printf("NO\n");            return ;        }    }    for(int i=0; i<posa; i++)        if(a[i] != b[i])        {            printf("NO\n");            return;        }    printf("YES\n");}void cmp4(){    if(posa != posb)//整数数位不相等直接返回    {        printf("NO\n");        return;    }        for(int i=0; i<posa; i++)//整数数位相等,逐位比较        if(a[i] != b[i])        {            printf("NO\n");            return;        }            int len1 = min(lena - posa - 1,lenb - posb -1);//以较短的那个小数位数的为标准进行诸位比较    for(int i=0; i<len1; i++)    {        if(a[i+posa] != b[i+posb])        {            printf("NO\n");            return;        }    }        int len2 = max(lena - posa - 1,lenb - posb - 1);//小数数位比较多的那个多出来的部分不为字符0也不相等    int len = len2 - len1;    if(len2 == lena - posa - 1)//a的位数更多    {        for(int i=0; i<len; i++)            if(a[i+len1+1+posa] != '0')            {                printf("NO\n");                return;            }    }        if(len2 == lenb - posb - 1)//b的位数更多    {        for(int i=0; i<len; i++)            if(b[i+len1+1+posb] != '0')            {                printf("NO\n");                return;            }    }    printf("YES\n");}int main(){    while(scanf("%s%s",a,b)!=EOF)    {        lena = strlen(a);        lenb = strlen(b);        posa = 0,posb = 0;        bool flaga = false,flagb = false;        int len = max(lena,lenb);                //将小数部分和整数部分分开,同时也检查是否有小数部分        for(int i=0; i<len; i++)        {            if(a[i] == '.')            {                posa = i;                flaga = true;            }            if(b[i] == '.')            {                posb = i;                flagb = true;            }        }        //都只用整数部分        if(!flaga && !flagb)            cmp1();                //a只有整数部分,b有小数部分        if(!flaga && flagb)            cmp2();                    //b只有整数部分,a有小数部分        if(flaga && !flagb)            cmp3();                    //都有小数部分        if(flaga && flagb)            cmp4();    }}




原创粉丝点击