杭电OJ 2054. A == B ?

题目描述:

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_typestring::npos

在C++中,查找一个字符串的子串,可以使用find()函数;

string 类提供了 6 种查找函数,每种函数以不同形式的 find 命名;

这些find操作全都返回一个类型为string::size_type的值(类似于unsigned int),如果查找成功,该返回值表示子串在字符串中匹配的起始位置;如果查找失败,该返回值为一个名为 string::npos 的特殊值,它大于任何一个有效的下标值。

 

关于erase()函数的使用方法:

  1. iterator erase(iterator pos); 删除pos指向的字符,返回一个迭代器,指向pos的下一个字符;
  2. iterator erase(iterator start, iterator end); 删除从start到end的所有字符,返回一个迭代器,指向被删除的最后一个字符的下一个位置;
  3. basic_string& erase(size_type  index, size_type num); 删除从下标index开始的num个字符,返回剩余的字符串。当参数只有index时,表示删除index后的所有字符;或者不带任何参数以删除字符串中的所有字符。

erase()函数使用方法参考自:https://blog.csdn.net/LJianDong/article/details/85127824

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值