本人第一篇博客,如有错,多多包涵,谢谢。
题目描述
给你两个正实数A 、B,判断他们是否相等,如果相等,输出“YES” ,否则输出“NO”。
输入
输入数据有多组,每组包括两个正实数 (可能很大,float,double类型变量都无法存储)。
输出
如果A与B相等,输出“YES” ,否则输出“NO” 。
样例输入 Copy
1.0 1.01 2.0 2.0 3.0 3.0 4.0 3.0
样例输出 Copy
NO YES YES NO
思路:
我们先来考虑整数的比较。整数的比较很简单,只要去除数字前面的无效0,然后比较即可
再来考虑小数的比较,小数的话,他的字符不仅限于数字了,还有特殊符号“.”
此时我们可以从后往前识别小数的最后一位,如果是0,说明此位上的数字无效(对比较没有用),如果是非0数字,说明此位上的数字有效,如果识别到了小数点,说明小数点后的数字都无效且都已经删除,那么删除小数点,并退出(防止把整数部分数字给删除了)
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a, b;
//存储数据A和B
while (cin >> a >> b)
{
while (a[0] == '0')
{
a.erase(0, 1);
}
//删除整数部分的无效数字
if (a.find('.') != string::npos)//确保这个数是小数
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] == '0' )
{
a.erase(i, 1);
}
else if (a[i] == '.')//识别到‘.’,要及时退出,防止把整数部分也删除了
{
a.erase(i, 1);
break;
}
else
{
break;
}
}
//删除小数部分的无效数字和无效小数点
while (b[0] == '0')
{
b.erase(0, 1);
}
//删除整数部分的无效数字
if (b.find('.') != string::npos)//确保这个数是小数
for (int i = b.size() - 1; i >= 0; i--)
{
if (b[i] == '0' )
{
b.erase(i, 1);
}
else if (b[i] == '.')//识别到‘.’,要及时退出,防止把整数部分也删除了
{
b.erase(i, 1);
break;
}
else
{
break;
}
}
//删除小数部分的无效数字和无效小数点
if (a == b)
{
cout << "YES"<<'\n';
}
else
{
cout << "NO" << '\n';
}
}
}