AcWing 5972. 科学记数法
问题描述
在科学记数法中,一个数被写成一个实数 A
与一个 10 的 B
次幂的积:
A × 10^B
在计算机中,上述式子一般表示为 A e B
。
给定一个实数 x
的科学记数法在计算机中的表示 a.deb
,其各个部分满足:
0 ≤ a ≤ 9
d
可以包含前导 0;d
可以为 0,但除此之外,不含多余末尾 0;d
的长度不超过 100;b
为非负整数;
请你将实数 x
还原为通常的十进制表示法后输出。
输入格式
输入一个形如 a.deb
的字符串,表示给定实数的科学记数法在计算机中的表示。
输出格式
输出通常的十进制表示法下的 x
,输出时:
- 如果
x
为整数,则输出其整数值,不要带小数部分和小数点,也不要带前导 0。 - 否则,以
p.q
的形式输出x
,其中p
作为整数部分不应包含前导 0(但可能等于 0),q
作为小数部分不应包含多余末尾 0(也不应等于 0)。
数据范围
- 前 5 个测试点满足
d
的长度不超过 3,0 ≤ b ≤ 3
。 - 所有测试点满足:
0 ≤ a ≤ 9
d
的长度范围[1, 100]
0 ≤ b ≤ 100
- 当
a
为 0 时,b
一定为 0。
输入样例 1
1.234e2
输出样例 1
123.4
输入样例 2
1.234e3
输出样例 2
1234
输入样例 3
0.44e0
输出样例 3
0.44
c++代码
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
string str, A, C = "1", mid;
int B;
string high_precision_multiplication(string a, string b) {
int m = a.size(), n = b.size(), k = m + n;
vector<int> aa(m, 0), bb(n, 0), cc(m + n, 0);
for (int i = 0; i < m; i++) aa[m - i - 1] = a[i] - '0';
for (int i = 0; i < n; i++) bb[n - i - 1] = b[i] - '0';
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cc[i + j] += aa[i] * bb[j];
cc[i + j + 1] += cc[i + j] / 10;
cc[i + j] %= 10;
}
}
while(cc[k - 1] == 0) k--;
string c;
for (int i = k - 1; i >= 0; i--) c += to_string(cc[i]);
return c;
}
int main() {
cin >> str;
int k = str.find("e"), cont = 0;
A = str.substr(0, k), B = stoi(str.substr(k + 1));
for (int i = 0; i < A.size(); i++) {
if (A[i] == '.') continue;
if (A[i] == '0') {
cont++;
if (i == A.size() - 1) {
cout << 0;
return 0;
}
}
else break;
}
if (cont != 0 && B <= cont) {
cont -= B;
if (cont == 0) {
cout << A.substr(A.find(".") + 1);
return 0;
}
string ans;
ans += "0.";
cont--;
while(cont--) ans += "0";
ans += A.substr(A.find(".") + 1);
cout << ans;
return 0;
}
else if (cont != 0){
B -= cont;
A = A.substr(A.find(".") + 1);
A.insert(1, ".");
}
while(B--) C = high_precision_multiplication(C, "10");
k = A.size() - (A.find(".") + 1);
for (int i = 0; i < A.size(); i++) {
if (A[i] != '.') mid += A[i];
}
mid = high_precision_multiplication(mid, C);
string int_part = mid.substr(0, mid.size() - k), decimal_part = mid.substr(mid.size() - k);
while(decimal_part.size() > 0 && decimal_part.back() == '0') decimal_part.erase(decimal_part.size() - 1);
string ans = int_part;
if (decimal_part.size() > 0) ans += "." + decimal_part;
cout << ans;
return 0;
}//by wqs