题目要求
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]”.”[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
输入格式
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。
输出格式
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
输入样例
+1.23400E-03
输出样例
0.00123400
解题思路
源码
#include <iostream>
#include <string>
using namespace std;
string a;
string b;
string c;
string d;
int i = 1;
int n = 0;
int len;
void solve_1() {
cout << b << endl;
}
void solve_2() {
i = 0;
bool flag = true;
n = n - len;
while (b[i] != '\0') {
if (flag && (b[i] == '0' || b[i] == '.')) {
i++;
continue;
}
flag = false;
if (b[i] != '.') {
cout << b[i];
}
i++;
}
i = 0;
while (i < n) {
cout << '0';
i++;
}
cout << endl;
}
void solve_3() {
i = 0;
bool flag = true;
while (b[i] != '\0') {
if (flag && b[i] == '0') {
i++;
continue;
}
flag = false;
if (i == n + 2) {
cout << '.';
cout << b[i];
} else if (b[i] == '.') {
cout << b[++i];
} else {
cout << b[i];
}
i++;
}
}
void solve_4() {
cout << "0.";
n--;
i = 0;
while (i < n) {
cout << '0';
i++;
}
i = 0;
while (b[i] != '\0') {
if (b[i] != '.') {
cout << b[i];
}
i++;
}
cout << endl;
}
int main() {
cin >> a;
bool isFuShu = false;
if (a[0] == '-') {
isFuShu = true;
}
i =1;
while (a[i] != 'E') {
b.push_back(a[i++]);
}
bool isZhengShu = false;
i++;
if (a[i] == '+') {
isZhengShu = true;
}
i++;
while (a[i] != '\0') {
c.push_back(a[i++]);
}
int j = 0;
while (c[j] != '\0') {
n *= 10;
n += c[j++] - '0';
}
if (isFuShu) {
cout << '-';
}
if (n == 0) {
solve_1();
return 0;
}
if (isZhengShu) {
len = b.length() - 2;
if (len <= n) {
solve_2();
} else {
solve_3();
}
} else {
solve_4();
}
return 0;
}