题目链接
中文版题面 - 由洛谷(中国大陆)提供
英文版题面 - 由CodeForces官网提供
思路
很简单的模拟题。
这道模拟题有一个难点就是如何将一个不符合规范的数转换成符合规范的数。
首先就是去除多余的零,这里我们只需要通过两遍循环,记录一下符合规范的数在给定的字符串中实际的头尾 l l l、 r r r。
l = -1;
for (int i = 0; i < s.size(); i++) {
if (s[i] != '0' && s[i] !='.') {
l = i;
break;
}
}
for (int i = s.size() - 1; i> -1; i--) {
if (s[i] != '0' && s[i] != '.') {
r = i;
break;
}
}
然后直接用自带的函数找到小数点的位置。
s.find('.');
难点解决了。
接下来就是将一个字符串转换成科学计数法规范下的数。
实际上这个过程并不算难,按照数学转换的模拟即可。
if (l == -1) {
cout << 0;
return 0;
}
if (l == r) {
cout << s[l];
}
if (l != r) {
cout <<s[l]<< ".";
for (int i = l + 1; i <= r; ++i)
if (s[i] != '.')
cout << s[i];
}
if (l + 1 != xsd) cout << "E" << xsd - l - (l < xsd);
完整代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int l, r;
l = -1;
for (int i = 0; i < s.size(); i++) {
if (s[i] != '0' && s[i] !='.') {
l = i;
break;
}
}
for (int i = s.size() - 1; i> -1; i--) {
if (s[i] != '0' && s[i] != '.') {
r = i;
break;
}
}
int xsd = s.find('.');
if (xsd == -1) {
xsd = s.size();
}
if (l == -1) {
cout << 0;
return 0;
}
if (l == r) {
cout << s[l];
}
if (l != r) {
cout <<s[l]<< ".";
for (int i = l + 1; i <= r; ++i)
if (s[i] != '.')
cout << s[i];
}
if (l + 1 != xsd) cout << "E" << xsd - l - (l < xsd);
return 0;
}
提醒
本题需要开启C++14,否则部分系统自带函数会报错。
C++14命令为 -std=c++14
,可在编译器中设置。
可在 CodeForces官网 上提交。