题目
如果机器只能保存 3 个有效数字,则将浮点数 12300 和 12358.9 视为相等(多余位数直接舍弃,不进行四舍五入),因为它们都保存为 0.123×105。
现在给定一个机器能够保存的有效数字位数,以及两个浮点数,请你判断两个数在该机器上是否相等。
注意:
数字不一定标准,可能有前导 0。
如果数值是0,则指数规定为0。
输入格式
共一行,包含三个数 N,A,B,分别表示有效位数,以及两个用来比较的浮点数。
输出格式
共一行,如果两个数相等,则先输出 YES,然后输出它们共同的保存方法,格式为 0.d[1]…d[N]10^k(d[1] > 0,除非数字为 0)。
如果两个数不相等,则先输出 NO,然后分别输出两个数的保存方法,格式同上。
数据范围
1≤N<100,
A 和 B 都不大于 10100,且总位数不超过 100。
输入样例1:
3 12300 12358.9
输出样例1:
YES 0.12310^5
输入样例2:
3 120 128
输出样例2:
NO 0.12010^3 0.12810^3
解法:模拟
时间复杂度O(n),空间复杂度O(n)
#include <iostream>
#include <cstring>
using namespace std;
string a, b;
string change(string a, int n) {
int k = a.find('.');
if (k == -1) a += ".", k = a.find('.');
string s = a.substr(0, k) + a.substr(k + 1);
while (s.size() && s[0] == '0') s = s.substr(1), k--;
if (s.empty()) k = 0;
if (s.size() > n) s = s.substr(0, n);
else s += string(n - s.size(), '0');
return "0." + s + "*10^" + to_string(k);
}
int main() {
int n;
cin >> n >> a >> b;
a = change(a, n), b = change(b, n);
if (a == b)
cout << "YES " << a;
else
cout << "NO " << a << ' ' << b;
return 0;
}