题目描述:
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
思路:
这道题目并没有看上去那么简单,主要考虑数字的精度问题,有些用例的精度甚至超过了任何一个数值类型所规定的范围。
思路就是,首先将两个数字转换成字符串形式,分别去除小数点后没有意义的0,然后再比较两个字符串是否一致即可。
实现(C++):
#include <iostream>
#include <string>
using namespace std;
string erase_zero(string num){ //去除数字小数点后没有意义的0
//首先判断num是否为小数
string::size_type idx;
idx=num.find(".");
if(idx!=string::npos){
int length=num.size();
int i;
for(i=length-1; num[i]=='0'; i--)
num.erase(i);
if(num[i]=='.')
num.erase(i);
}
return num;
}
int main(){
string a, b;
while(cin>>a>>b){
string _a=erase_zero(a);
string _b=erase_zero(b);
if(_a==_b)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 1;
}
其中,关于string::size_type和string::npos:
在C++中,查找一个字符串的子串,可以使用find()函数;
string 类提供了 6 种查找函数,每种函数以不同形式的 find 命名;
这些find操作全都返回一个类型为string::size_type的值(类似于unsigned int),如果查找成功,该返回值表示子串在字符串中匹配的起始位置;如果查找失败,该返回值为一个名为 string::npos 的特殊值,它大于任何一个有效的下标值。
关于erase()函数的使用方法:
- iterator erase(iterator pos); 删除pos指向的字符,返回一个迭代器,指向pos的下一个字符;
- iterator erase(iterator start, iterator end); 删除从start到end的所有字符,返回一个迭代器,指向被删除的最后一个字符的下一个位置;
- basic_string& erase(size_type index, size_type num); 删除从下标index开始的num个字符,返回剩余的字符串。当参数只有index时,表示删除index后的所有字符;或者不带任何参数以删除字符串中的所有字符。
erase()函数使用方法参考自:https://blog.csdn.net/LJianDong/article/details/85127824