这种题目做多了,脑细胞会死一大片,不多说了,给一些测试数据吧
00123.123000 123.123
-0.00 0
123 123. (后面有个小数点)
.1(前面有个小数点) 0.1
结果
YES
YES
YES
YES
#include<iostream>
#include<string>
#define Max 1000010
using namespace std;
char a[Max], b[Max];
int main()
{
while(scanf("%s%*c%s", a, b) != EOF)
{
char *c, *d;
char ch1 = '+', ch2 = '+';
int i, j;
//有小数的情况下去除a后导的零
bool p = false;
for(i = 0; a[i] != '\0'; i++)
{
if(a[i] == '.')
{
p = true;break;
}
}
if(a[0] == '+' ||a[0] == '-')
{
ch1 = a[0];
for(j = 1; a[j] != '\0'; j++)
a[j-1] = a[j];
}
if(p == true)
{
for(i = strlen(a)-1; i >= 0; i--)
{
if(a[i] != '0')
{
if(a[i] == '.')
a[i] = NULL;
else
a[i+1] = NULL;
break;
}
}
}
//有小数的情况下去除b后导零
p = false;
for(i = 0; b[i] != '\0'; i++)
{
if(b[i] == '.')
{
p = true;break;
}
}
if(b[0] == '+' ||b[0] == '-')
{
ch2 == b[0];
for(j = 1; b[j] != '\0'; j++)
b[j-1] = b[j];
}
if(p == true)
{
for(i = strlen(b)-1; i >= 0; i--)
{
if(b[i] != '0')
{
if(b[i] == '.')
b[i] = NULL;
else
b[i+1] = NULL;
break;
}
}
}
//去除a的前导零
i = 0;
int l1;
l1 = strlen(a);
if(a[0] == '.')
{
for(j = l1-1; j >= 0; j--)
a[j+1] = a[j];
a[l1+1] = NULL;
a[0] = '0';
}
while(a[i] == '0' || a[i] == '+' || a[i] == '-')
i++;
if(a[i] == '.' || i == strlen(a))//遇到小数点或全零的时候
c = a + i - 1;
else
c = a + i;
//去除b的前导零
i = 0;
int l2;
l2 = strlen(b);
if(b[0] == '.')
{
for(j = l2-1; j >= 0; j--)
b[j+1] = b[j];
b[l2+1] = NULL;
b[0] = '0';
}
while(b[i] == '0' || b[i] == '+' || b[i] == '-')
i++;
if(b[i] == '.' || i == strlen(b))//遇到小数点或全零的时候
d = b + i - 1;
else
d = b + i;
if((!strcmp(c, "0")) && (!strcmp(d, "0")))//+0 == -0 的情况
{
puts("YES");continue;
}
if(strcmp(c, d))
puts("NO");
else if(ch1 == ch2)
puts("YES");
else
puts("NO");
}
return 0;
}
本文深入探讨了一种用于比较复杂数值(包括整数和浮点数)的算法实现细节,通过去除前导零、小数点等冗余部分,确保有效比较。详细解释了如何在C++中通过字符串操作实现这一功能,包括特殊处理如+0和-0的比较,为编程爱好者提供了解决类似问题的思路和技巧。
1925

被折叠的 条评论
为什么被折叠?



