这个题看似不难,但是细节处理还是有点烦的。
注意几个点:
1、首先判断小数点的位置,然后看去掉小数点后,字符串长度是否大于等于n。这里是要分别处理的,如果小于n的话要补0.
2、第一次交测试点3没过
想了一下测试用例:2 0.034 0.03
自己的程序并没有考虑到数字是0.XXX的,所以在方法前面又加了判断是否是小于1的小数。最后就A了。
#include <bits/stdc++.h>
using namespace std;
int n;
string tran(string s) {
int pos = 0, flag = 1, dig = 1;
if (s[0] == '0' && s[1] == '.') dig = -1;
while (s[pos] == '0' || s[pos] == '.') pos++;
s = s.substr(pos);
int k = s.find('.');
if (k == -1) { //没有小数点
k = s.size();
flag = 0;
}
if (n <= s.size() - flag) {
string temp = s.substr(0, n + (k < n ? 1 : 0));
if (temp.find('.') != -1) temp.erase(temp.find('.'), 1);
s = temp;
}
else {
string temp = s, zr;
if (flag == 1) temp.erase(k, 1);
for (int i = 0; i < n - s.size() + flag; i++) zr += '0';
s = temp + zr;
}
if (dig == -1) return "0." + s + "*10^" + to_string(dig * (pos - 2));
return "0." + s + "*10^" + to_string(k);
}
int main() {
string s1, s2;
cin >> n >> s1 >> s2;
s1 = tran(s1);
s2 = tran(s2);
if (s1 == s2) cout << "YES " << s1;
else cout << "NO " << s1 << " " << s2 << endl;
}