- 这题的关键是小数点的处理,为了方便提取有效数字,先将小数点去掉
- 设置一个变量
nonNegativePos
确定第一个非零位 - 可以用stringstream将数字转换为字符串,需要包含头文件sstream
#include<string>
#include<iostream>
#include<sstream>
using namespace std;
string getRes(string s, int digit) {
int exp; //化为标准形式后的指数
int dotPos = s.find('.');
for (string::iterator it = s.begin(); it != s.end(); it++) {
if (*it == '.') {
s.erase(it); //删去数字的小数点
break;
}
}
int nonNegativePos = -1; //数字第一个非零位的位置
for (int i = 0;i < s.length();i++) {
if (s[i] >= '1' && s[i] <= '9') {
nonNegativePos = i;
break;
}
}
if (nonNegativePos == -1) { //没有非零位
string t;
while (t.length() < digit)
t += "0";
return "0." + t + "*10^0";
}
if (dotPos == -1) { //没有小数点
exp = s.length();
}
else exp = dotPos - nonNegativePos;
s = s.substr(nonNegativePos, digit);
while (s.length() < digit) {
s += "0";
}
//将指数转换为字符串
string e;
stringstream ss;
ss << exp;
ss >> e;
return "0." + s + "*10^" + e;
}
int main() {
int digitNum;
scanf("%d", &digitNum);
string s1, s2;
cin >> s1 >> s2;
string res1 = getRes(s1, digitNum), res2 = getRes(s2, digitNum);
if (res1 == res2) {
cout << "YES " << res1 << endl;
}
else {
cout << "NO " << res1 << " " << res2 << endl;
}
}
二刷:
注意erase(start, size)
的用法。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int digitNum;
string getNum(string num) {
int pointIndex = 0; //index of decimal point
while(pointIndex < num.length() && num[pointIndex] != '.')
pointIndex++;
if(pointIndex < num.length()) {
num.erase(pointIndex, 1); //remove decimal point
}
int start = 0;
while(start < num.length() && num[start] == '0' || num[start] == '.') {
start++;
}
int size = min((int)(num.length() - start), digitNum);
string validDigits = num.substr(start, size);
while(validDigits.length() < digitNum)
validDigits += "0";
int exp = pointIndex - start;
if(start >= num.length())
exp = 0;
string res = "0." + validDigits + "*10^" + to_string(exp);
return res;
}
int main() {
cin >> digitNum;
string n1, n2;
cin >> n1 >> n2;
string s1 = getNum(n1), s2 = getNum(n2);
if(s1 == s2) {
cout << "YES " << s1;
} else {
cout << "NO " << s1 << " " << s2;
}
}