PAT 乙级 1024. 科学计数法 (20) C++版

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]“.”[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。

输入格式:

每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。

输入样例1:

+1.23400E-03

输出样例1:

0.00123400

输入样例2:

-1.2E+10

输出样例2:

-12000000000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <cstdio>
#include <iostream>
#include <cmath>

using namespace std;

string *parse(string in) {
string *s = new string[3];

int i = 0;
while (in[i] != '.') {
s[0] += in[i++];
}
i++;

while (in[i] != 'E') {
s[1] += in[i++];
}
i++;

while (i < in.size()) {
s[2] += in[i++];
}
return s;
}

int parseInt(string s) {
int num = 0;
for (int i = 1; i < s.size(); i++) {
num = num * 10 + s[i] - '0';
}

if (s[0] == '-') {
num = -num;
}
return num;
}

int main() {
string in;
cin >> in;
string *sci = parse(in);

int eff = parseInt(sci[0]);
int pow = parseInt(sci[2]);
if (pow >= 0) {
printf("%d", eff);

bool havePoint = true;
if (sci[1].length() <= pow) {
havePoint = false;
}
int i = 0;
for (i = 0; i < sci[1].length() && pow != 0; i++, pow--) {
putchar(sci[1][i]);
}

if (havePoint) {
printf(".");
for (; i < sci[1].length(); i++) {
putchar(sci[1][i]);
}
}

while (pow != 0) {
printf("0");
pow--;
}

} else {
if (eff < 0) {
printf("-");
eff = -eff;
}

printf("0.");
for (int i = 1; i < abs(pow); i++) {
printf("0");
}
printf("%d", eff);
cout << sci[1];
}
return 0;
}