- 问题描述
给你两个非负实数A和B,如果A等于B,输出 "YES", 否则输出"NO" - 输入说明
第一行N,表示有N组测试数据。
以下N行,每行两个非负实数 A和B。每个实数不超过1000位,且可能在前面和后面有0存在。
- 输出说明
对于每组测试数据,如果A和B相等则输出 "YES", 否则输出 "NO"。
每组测试数据占一行,两组测试数据之间无空行。行首与行尾均无空格。
- 输入范例
cpp
2
100.0 00100
0100.1234576 00000000100.123457
- 输出范例
cpp
YES
NO
感想:substr()切割字符串,使用find_first_not_of() find_last_not_of()
代码如下:
cpp
#include <bits/stdc++.h>
using namespace std;
// 标准化实数字符串:消除前导0、后导0、多余小数点
string normalize(string s) {
// 步骤1:处理小数点,拆分整数部分和小数部分
auto dot_pos = s.find('.');
string integer_part = s.substr(0, dot_pos);
string decimal_part = (dot_pos != string::npos) ? s.substr(dot_pos + 1) : "";
// 步骤2:移除整数部分的前导0(保留单个0,如"000"→"0")
auto first_non_zero = integer_part.find_first_not_of('0');
if (first_non_zero != string::npos) {
integer_part = integer_part.substr(first_non_zero);
} else {
integer_part = "0"; // 整数部分全0,保留一个0
}
// 步骤3:移除小数部分的后导0
if (!decimal_part.empty()) {
auto last_non_zero = decimal_part.find_last_not_of('0');
if (last_non_zero != string::npos) {
decimal_part = decimal_part.substr(0, last_non_zero + 1);
} else {
decimal_part = ""; // 小数部分全0,清空
}
}
// 步骤4:拼接结果(无小数部分则不加小数点)
if (decimal_part.empty()) {
return integer_part;
} else {
return integer_part + "." + decimal_part;
}
}
int main() {
int n;
cin>>n;
string arr[n][2];
for(int i = 0; i<n; ++i) {
cin>>arr[i][0]>>arr[i][1];
if(normalize(arr[i][0]) == normalize(arr[i][1]))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}