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


                                                                                                              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 2 2 2 3 3 4 3
     

    Sample Output
    NO
    YES
    YES
    NO




    解题心得:
    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
    ");
            else
                printf("NO
    ");
            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
    ");
            return ;
        }
        
        for(int i=0; i<lena; i++)//数位相等直接比较
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
        printf("YES
    ");
    }
    
    void cmp2()
    {
        if(posb != lena)//b的整数数位比a大,直接返回
        {
            printf("NO
    ");
            return;
        }
        
        for(int i=posb+1; i<lenb; i++)//因为a是整数,只要b的小数部分不全为0直接返回
        {
            if(b[i] != '0')
            {
                printf("NO
    ");
                return ;
            }
        }
        
        for(int i=0; i<posb; i++)//b小数部分为0,整数数位相等,逐位比较就好
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
            
        printf("YES
    ");
    }
    
    void cmp3()
    {
        //和cmp2差不多
        if(posa != lenb)
        {
            printf("NO
    ");
            return;
        }
        for(int i=posa+1; i<lena; i++)
        {
            if(a[i] != '0')
            {
                printf("NO
    ");
                return ;
            }
        }
        for(int i=0; i<posa; i++)
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
        printf("YES
    ");
    }
    
    void cmp4()
    {
        if(posa != posb)//整数数位不相等直接返回
        {
            printf("NO
    ");
            return;
        }
        
        for(int i=0; i<posa; i++)//整数数位相等,逐位比较
            if(a[i] != b[i])
            {
                printf("NO
    ");
                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
    ");
                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
    ");
                    return;
                }
        }
        
        if(len2 == lenb - posb - 1)//b的位数更多
        {
            for(int i=0; i<len; i++)
                if(b[i+len1+1+posb] != '0')
                {
                    printf("NO
    ");
                    return;
                }
        }
        printf("YES
    ");
    }
    
    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();
        }
    }




  • 相关阅读:
    慢性肾炎患者的家庭养护
    中国居民五谷膳食指南
    第二单元丨对环境的察觉
    一个人是否靠谱,闭环很重要
    打赢营销胜仗
    治本修身──中醫內分泌調節養生法
    理想的激励
    卓越演讲:打动听众必知必会的策略和方法(原书第3版)
    每日一题_191008
    每日一题_191007
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107349.html
Copyright © 2020-2023  润新知