您的位置:首页 > 其它

HDU-2054 A==B?

2014-07-12 23:25 246 查看
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
=='0' && n<len;++n);
if( n==len )strcpy(b,Zero);//0000000  --> 0
else
while( n<len && (n!=0) ) //    00000.22 --> .22
{
b[i++] = b
;
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;
}


      

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: