题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054
此题卡数据,卡爆所有数据,
例如下面数据包括其他的都得成立:
0012. 12.
.25 .25000
. .
12.1000001 0012.10000010000
01200 0001200
012. 012.0000
.025 0000.0250000000000000000000000000000000
0.0 0.
.0 .0000
00000000000000000000000001 1.0000000000000000000000
005. 05.00000000000000
第一次提交居然WA,实在无语,只好决定把数组都扩大10倍,再交就AC了,彻底无语了!强悍的测试数据~~
代码如下:
#include <iostream> using namespace std; #include<string.h> #include<ctype.h> char a[100000],b[100000],a1[50000],a2[50000];//a1存整数部分(和小数点). a2存小数部分. void convert(char s[]) { int i,j,k,k1,k2,l,p1=1,m=0,k3; int pre=0,post=0;//点前面 点后面是否有数字 做标记 l=strlen(s); for(i=0;i<l;i++) if(s[i]=='.')//判断有没有小数点 { p1=0; k=i; break; } if(p1)//没小数点 { for(i=0;i<l;i++) //全部为n个0的情况 if(s[i]!='0') { k1=i; break; } if(i==l)strcpy(s,"0"); else { j=0; for(i=k1;i<l;i++) a1[j++]=s[i]; a1[j]='\0'; strcpy(s,a1); } } else//有小数点 分四种情况:点前面有数、没数和点后有数、没数 { if(isdigit(s[0]))pre=1; if(s[k+1]!='\0')post=1; if(pre==0&&post==0) strcpy(s,"0"); else if(pre==1&&post==0) { for(i=0;i<k;i++) if(s[i]!='0') { k1=i; break; } if(i==k)strcpy(s,"0"); else { k2=0; for(i=k1;i<l-1;i++) a1[k2++]=s[i]; a1[k2]='\0'; strcpy(s,a1); } } else if(pre==0&&post==1) { strcpy(a1,"0."); for(i=k+1;i<l;i++) if(s[i]!='0')a2[m++]=s[i]; else { for(j=i+1;j<l;j++) if(s[j]!='0')break; if(j!=l)a2[m++]=s[i]; } a2[m]='\0'; strcat(a1,a2); strcpy(s,a1); } else { //求整数部分 for(i=0;i<k;i++) if(s[i]!='0') { k1=i; break; } if(i==k) { strcpy(a1,"0"); k3=1; //记录a1的长度 等会可能要在后面加个小数点 } else { j=0; for(i=k1;i<k;i++) a1[j++]=s[i]; a1[j]='\0'; k3=j; } //求小数部分 for(i=k+1;i<l;i++) if(s[i]!='0')break; if(i==l) strcpy(s,a1); else { k2=0; for(i=k+1;i<l;i++) { if(s[i]!='0')a2[k2++]=s[i]; else { for(j=i+1;j<l;j++) if(s[j]!='0')break; if(j!=l)a2[k2++]=s[i]; } a2[k2]='\0'; } a1[k3++]='.'; a1[k3]='\0'; strcat(a1,a2);//写到了上一个for里面 运行时发现错误并改正 strcpy(s,a1); } }//else }//else } int main() { //freopen("d:\\1.txt","r",stdin); while(scanf("%s%s",a,b)!=EOF) { int l1,l2; convert(a); convert(b); l1=strlen(a); l2=strlen(b); //printf("l1=%d l2=%d\n%s\n%s\n",l1,l2,a,b); if(l1!=l2)cout<<"NO"<<endl; else { for(int i=0;i<l1;i++) if(a[i]!=b[i])break; if(i==l1)cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }