HDU-2054 A==B?

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

越简单粗暴的话越多坑 - -

 

给你两个数字,判断是否相等。要发挥想象力想象各种丧心病狂的数据:

       100.0    00100

       .0          000.00

       1.010   00.010

       不知道有多少位 - - 看了讨论版..至少十万位 ..这尼玛的丧心病狂骂人

 

       本来思路挺好的,后面一个地方漏了等于号心情严重被打击,代码越写越挫 ..

 

       一开始,想了四个函数。

            1)去掉前面‘ 0 ’的函数。因为 000001 和 1 是相等的。00000.2 和 .2是相等的。

            2)判断是否有小数点。区分整数与浮点数的比较(从这里思路就开始挫了 = = 看他们的精简代码二十行搞定,虐心)

            3)去掉后面无用的‘ 0 ’。   1.2000 与 1.2是相等的。

            4)经过上面一系列操作之后的数组的最大下标值(一开始写忘记了..看函数名记成真实长度...以后函数名字要取好)

 

       因为有上万位数,所以要考虑时间消耗,首选用 C ,还有一个小函数做了内联,0ms AC了。

     这里要有掌声,稍微赞一下代码写挫了但是还是机智的 0ms 的我。

 

       主函数承担了,最终的两个数的判断。用了最挫的一个一个比较....啊,头痛,让我休息一下,估计能想出更好的办法。

 

这里要补一下关于 cstring 头文件的几个主要函数:

               char *strstr ( char *a,char *b)  : 找出 b 字符串 在 a 字符串出现第一次出现的位置(不包括\0),返回该位置指针,无则返回NULL

               char *strchr ( char *a, int ch )  :找出 a 字符串第一次出现字符 ch 的位置,返回该位置指针,无则返回NULL

 

             一开始忘记了 strchr ( char *a,int ch) 函数啊!!

             自己写了一个又重推了!!!!我华丽丽的时间啊 = =

             结果还是没用那个。键盘上一口血啊。

 

 

          再见无线鼠标坏了,用了触控板快死了我得去洗洗睡了。以下AC代码。(伐开森,要鼠标 (喂!

 

#include <cstdio>
#include <cstring>
//#include <cctype>
//#include <cstdlib>//qsort
//#include <algorithm>//sort reverse
#define FOR(i,n) for(int i = 0; i<n ; ++i)
const int MAXSIZE = 100000;
char BigOne[MAXSIZE];
char BigTwo[MAXSIZE];
const char Zero[1]={'0'};
/* qsort --> int cmp( const void *,const void *) */

void FrontZero( char *b )
{
    int len = strlen(b);
    int n;
    int i = 0;
    for( n = 0 ; b[n] =='0' && n<len;++n);
    if( n==len )strcpy(b,Zero);//0000000  --> 0
    else
        while( n<len && (n!=0) ) //    00000.22 --> .22
        {
            b[i++] = b[n];
            b[n++] =' ';
        }
}

int RadixPoint( char *b)
{
    if(strcmp(b,Zero)==0)return 0;
    else
        {
            int n = strlen(b);
            FOR(i,n)
                {
                    if( b[i]=='.' )return 1;
                }
            return 0;
        }
}

//有小数点的话去除尾部多余的零
void DePoint( char * p  )
{
    int len = strlen(p)-1;
    int i;
    for(i=len ; i>=0;--i)
    {
        if(p[i]=='0'||p[i]==' ')p[i]=' ';
         else break;
    }
    if(p[i]=='.')p[i]=' ';

}
/*
时间消耗:

     输入数据   cin  30ms
                scanf("%s%s", )   15ms
                
     长度函数   inline 内联 0ms
*/
inline int RealLenth(char *b)//前面塞的空格不算长度
{
    int len = strlen(b)-1;
    for( ; b[len]==' ';--len);
    return len;
}
int main()
{
   // cout<<strcmp("0.22    ","0.22000")<<endl;

    while( scanf("%s%s",BigOne,BigTwo)!=EOF )
    {

        //  00100.00  001000 000100.01 000000
        FrontZero(BigOne);
        FrontZero(BigTwo);

        //是否有小数点
        if( RadixPoint(BigOne) )DePoint(BigOne);
        if( RadixPoint(BigTwo) )DePoint(BigTwo);

        int Olen = RealLenth(BigOne);
        int Tlen = RealLenth(BigTwo);
        bool flag = true ;

            int n = Olen > Tlen ? Olen :Tlen;
            for( int i = 0 ;i <=n ;++i )
                {

                    if(  BigOne[i]!=BigTwo[i] )
                    {
                        flag=false;
                        break;
                    }
                }
                if( flag==true )puts("YES");
                else puts("NO");

    }

    return 0;
}


      


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值