题目
如果机器只能保存 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.123
10^5
输入样例2:
3 120 128
输出样例2:
NO 0.12010^3 0.12810^3

解法:模拟

时间复杂度O(n),空间复杂度O(n)

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. string a, b;
  5. string change(string a, int n) {
  6. int k = a.find('.');
  7. if (k == -1) a += ".", k = a.find('.');
  8. string s = a.substr(0, k) + a.substr(k + 1);
  9. while (s.size() && s[0] == '0') s = s.substr(1), k--;
  10. if (s.empty()) k = 0;
  11. if (s.size() > n) s = s.substr(0, n);
  12. else s += string(n - s.size(), '0');
  13. return "0." + s + "*10^" + to_string(k);
  14. }
  15. int main() {
  16. int n;
  17. cin >> n >> a >> b;
  18. a = change(a, n), b = change(b, n);
  19. if (a == b)
  20. cout << "YES " << a;
  21. else
  22. cout << "NO " << a << ' ' << b;
  23. return 0;
  24. }