Problem Description
Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO".
Input
each test case contains two numbers A and B.
Output
for each case, if A is equal to B, you should print "YES", or print "NO".
Sample Input
1 2
2 2
3 3
4 3
Sample Output
NO
YES
YES
Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO".
Input
each test case contains two numbers A and B.
Output
for each case, if A is equal to B, you should print "YES", or print "NO".
Sample Input
1 2
2 2
3 3
4 3
Sample Output
NO
YES
YES
NO
这是一道坑爹题目,如果用double类型储存的话,会无法精确的判断两个数字是否相等。。所以要用字符串处理。
首先要去掉前导0和后导0(注意如果读入的数字不是小数的话,不用去掉后导0)
然后判断去掉后的两个字符串长度是否相等,如果不相等则直接输出NO。。。
如果相等的话,再判断两个数字是否都为0,如果都为0的话,直接输出YES。(这里不用管正负号,因为+0和-0也是相等的)。
接下来就是两个数字的长度相等而且都不为0了,这时候判断两个数是否异号,如果异号直接输出NO。
最后一种情况则是两个数字同号而且长度也相等,这时候只需要从第一位开始一直到最后一位依次对两个数字的每一位进行判断,如果每一位数字都相等的话,那么输出YES,否则输出NO。
AC代码如下(后来发现最后判断的时候有BUG但是没有修改,大家可以对照着思路自己敲一份):
#include <stdio.h>
#include <string.h>
typedef struct
{
int left,right;
char num[1000000];
} node;
node a, b;
node change(node n)
{
int i, flag;
n.right = strlen(n.num) - 1;
if(n.num[0] == '+' || n.num[0] == '-')
n.left = 1;
else
n.left = 0;
for(i = n.left, flag = 0; i <= n.right; i++)
{
if(n.num[i] == '.')
{
flag = 1;
break;
}
}
if(flag)
{
for(i = n.right; i >= n.left; i--)
{
if(n.num[i] == '0')
n.right--;
else
break;
}
if(n.num[n.right] == '.')
n.right--;
}
for(i = n.left; i <= n.right; i++)
{
if(n.num[i] == '0')
n.left++;
else
break;
}
return n;
}
int main()
{
int i, j, flag;
while(scanf("%s %s", a.num, b.num)!=EOF)
{
a = change(a);
b = change(b);
if(a.right - a.left != b.right - b.left)
printf("NO\n");
else if(a.num[a.right] == '0' && b.num[b.right] == '0')
printf("YES\n");
else
{
if(a.num[a.left] == b.num[b.left])
{
for(i = a.left, j = b.left, flag = 1; i <= a.right; i++, j++)
{
if(a.num[i] != b.num[j])
{
flag = 0;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
}
return 0;
}