这道题看似很简单,但其实如果数据一大,大到long long, double 都不行,就没得办法了。所以这道题要用字符数组来做。
思路是:A,B两个数,先去除一些无效的数字,如0000030,前面那些0就可以去掉,去掉之后比较两者长度是否相等:
1.LEN(A)==LEN(B),直接用strcmp比较;
2.LEN(A)>LEN(B),将B的长度补齐至与A同等长,再用strcmp比较;
3.LEN(A)<LEN(B),将A的长度补齐至与B同等长,再用strcmp比较。
代码如下:
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
char s1[100005],s2[100005];
int main()
{
int flag;
int i,len1,len2,shot; //len1记录s1的有效长度,len2记录s2,shot标记短的那个字符串
int start1,start2,dot1,dot2; //start:从前往后扫描,若扫到不为‘0’的字符,开始记录,姑且称为有效部分,dot:标记字符串中是否有小数点
while(~scanf("%s %s",s1,s2))
{
len1=len2=shot=start1=start2=dot1=dot2=0;
for(i=0;s1[i]!='\0';i++)
{
if(s1[i]!='0') start1=1;
if(s1[i]=='.') dot1=1;
if(start1)
{
s1[len1++]=s1[i];
}
// else s1[len1++]=s1[i];
}s1[len1]='\0'; //莫忘
for(i=0;s2[i]!='\0';i++)
{
if(s2[i]!='0') start2=1;
if(s2[i]=='.') dot2=1;
if(start2)
{
// if(s2[i]!='0')
s2[len2++]=s2[i];
}
// else s2[len2++]=s2[i];
}s2[len2]='\0'; //莫忘
// printf("%s %s\n",s1,s2);
if(len1==len2) //相等,直接比较
{
if(strcmp(s1,s2)==0) printf("YES\n");
else printf("NO\n");
}
else
{
if(len1>len2)
{
for(i=len2;i<=len1-1;i++)
{
if(!dot2) //没有小数点的情况
{
if(i==len2) s2[i]='.';
else s2[i]='0';
}
else s2[i]='0';
}
s2[len1]='\0';
}
else
{
for(i=len1;i<=len2-1;i++)
{
if(!dot1)
{
if(i==len1) s1[i]='.';
else s1[i]='0';
}
else s1[i]='0';
}
s1[len2]='\0';
}
if(strcmp(s1,s2)==0) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
这种做法当遇到像0.23231这种数据时,会变成.23231,但并无大碍。