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没有限制,可能有几千位、几万位那么长,所以要用字符串类型。
因为可能会出现如3.5000000这样的后置0和00000003.5这样的前置0,所以要用str.erase函数删除无效的0。像3.000000这种情况还需要删除无效的小数点。
除了上面这些普通情况之外,还有00000.000000这样的特殊情况,需要保留一个0。
如果不加入strchr函数判断字符串中是否有小数点,则会把200000中的0也都删去。
总而言之,这道题需要判断哪些是有效的0和小数点哪些是无效的0和小数点,以及如何删去它们。
但是我到现在还没搞明白str.erase(0)和str.erase(0,1)的区别?
strchr(str.c_str(),’.’)
str.c_str()函数:
返回当前字符串的首字符地址。
strchr函数:
char strchr(const char _Str,char _Val)
char strchr(char _Str,char _Ch)
头文件:string.h
功能:查找字符串_Str中首次出现字符_Val的位置
说明:返回首次出现_Val的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果Str中不存在Val则返回NULL。
返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL
int fun(String& str)中的&表示引用运算符。fun函数表示的是通过引用来进行实参于形参的传递。
引用就是某一变量(对象)的一个别名,对引用的操作与对变量直接操作完全一样。
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
void change(string &str);
int main()
{
string a,b;
while(cin>>a>>b)
{
change(a);
change(b);
if(a.compare(b)==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
void change(string &str)
{
int last=str.length()-1;
if(strchr(str.c_str(),'.'))
//如果字符串中有小数点,需要删除末尾0
//没有小数点的字符串,只需要考虑前置0
{
while(str[last]=='0')//删除末尾无效的0
{
str.erase(last);
last--;
}
if(str[last]=='.')
//如果删除完无效0后末尾只剩一个.
//证明小数点无效,删除
{
str.erase(last);
}
}
while(str[0]=='0'&&str.length()>1)
//给000.000类型的数留一个0
{
str.erase(0,1);
}
}