一、题目大意
- PAT A1060
- 给出有效位数 n ,给出两个浮点数,问在(类似)科学计数法的存储情况下,只考虑有效位以内的尾数(其余的直接截去,不四舍五入)和指数,判断两个数是否相等。
二、解题思路
- 基本思路就是标准化处理。将两个字符串都处理成标准尾数和指数的形式,然后判等。
- 处理字符串时,要先去除前导 0,然后根据首位是否为小数点分情况处理。
- 若首位为小数点,去掉首位后,要去除前导 0 ,每去除一位,指数相应减一,直到处理完所有的前导 0 。如果处理完毕字符串为空,说明该数为 0 ,故令指数为 0 。
- 若首位不为小数点,则要找小数点。每向后找一位,指数相应加一,直到找到了小数点或者到了最后一位。
- 最后再处理字符串,使其仅保留有效位以内的尾数。注意位数不足时后面补 0 。
三、参考代码
#include<iostream>
#include<string>
using namespace std;
void deal(string& s, int& e, int n) {
string t;
int i = 0;
while (s.size() && s[0] == '0') s.erase(s.begin());
if (s[0] == '.') {
s.erase(s.begin());
while (s.size() && s[0] == '0') {
s.erase(s.begin());
e--;
}
}
else {
i = 0;
while (i < s.size() && s[i] != '.') { i++; e++; }
if (i < s.size()) s.erase(s.begin() + i);
}
if (s.empty()) e = 0;
for (i = 0; i < n; i++) {
if (i < s.size()) t += s[i];
else t += '0';
}
s = t;
}
int main() {
string s1, s2;
int e1 = 0, e2 = 0, n;
cin >> n >> s1 >> s2;
deal(s1, e1, n);
deal(s2, e2, n);
if (s1 == s2 && e1 == e2) {
cout << "YES 0." << s1 << "*10^" << e1 << endl;
}
else {
cout << "NO 0." << s1 << "*10^" << e1;
cout << " 0." << s2 << "*10^" << e2 << endl;
}
return 0;
}
四、解题感悟
- 这种题一定要细心。其实只要思路明确,写代码还是挺容易的。