亚马逊海外网站杭州专业seo公司
问题描述
在科学记数法中,一个数被写成一个实数 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