原题 http://acm.hdu.edu.cn/showproblem.php?pid=2054
题目:
A == B ?
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 75835 Accepted Submission(s): 12024
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
NO
思路:
很简单的比较,A=B的时候输出YES。
但是会有哪些数据呢?
1 1? 1.0 1? 1.00 1.0? 0.0 0?
而且没有限制数据大小,这种情况下只有用高精度了。
首先我们需要看是否有小数点,并将有小数点的后导0全删掉,没有小数的时候小数点也删掉。
然后进行字符串比对。
代码:
c++代码如下:
#include <iostream>
#include"string.h"
#include"cstdio"
#include"stdlib.h"
#include"algorithm"
#include"math.h"
using namespace std;
typedef long long int lint;
int main()
{
char s1[100000];
char s2[100000];
memset(s1,'\0',sizeof(s1));
memset(s2,'\0',sizeof(s2));
while(scanf("%s %s",s1,s2)!=EOF)
{
int la=strlen(s1);
int flag1=0;
for(int i=0; i<la; i++)
{
if(s1[i]=='.')
{
flag1=1;
break;
}
}
if(flag1)
{
for(int i=la-1; i>=0; i--)
{
if(s1[i]=='0')
s1[i]='\0';
else if(s1[i]=='.')
{
s1[i]='\0';
break;
}
else
break;
}
}
int lb=strlen(s2);
int flag2=0;
for(int i=0; i<lb; i++)
{
if(s2[i]=='.')
{
flag2=1;
break;
}
}
if(flag2)
{
for(int i=lb-1; i>=0; i--)
{
if(s2[i]=='0')
s2[i]='\0';
else if(s2[i]=='.')
{
s2[i]='\0';
break;
}
else
break;
}
}
if(strcmp(s1,s2)) printf("NO\n");
else printf("YES\n");
memset(s1,'\0',sizeof(s1));
memset(s2,'\0',sizeof(s2));
}
return 0;
}
Java的高精度做的很好,直接调用compareTo函数比较即可。
Java高精度代码如下:
import java.util.Scanner;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
BigDecimal a;
BigDecimal b;
while(scanner.hasNext())
{
a=scanner.nextBigDecimal();
b=scanner.nextBigDecimal();
int c=a.compareTo(b);
if(c==0) System.out.println("YES");
else System.out.println("NO");
}
scanner.close();
}
}