题目
Scientific notation is the way that scientists easily handle very large numbers or very small numbers. The notation matches the regular expression [+-][1-9]”.”[0-9]+E[+-][0-9]+ which means that the integer portion has exactly one digit, there is at least one digit in the fractional portion, and the number and its exponent’s signs are always provided even when they are positive.
Now given a real number A in scientific notation, you are supposed to print A in the conventional notation while keeping all the significant figures.
Input Specification:
Each input file contains one test case. For each case, there is one line containing the real number A in scientific notation. The number is no more than 9999 bytes in length and the exponent’s absolute value is no more than 9999.
Output Specification:
For each test case, print in one line the input number A in the conventional notation, with all the significant figures kept, including trailing zeros,
Sample Input 1:
+1.23400E-03
Sample Output 1:
0.00123400
Sample Input 2:
-1.2E+10
Sample Output 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
using namespace std;
int main() {
string s, res;
bool f = false;
cin >> s;
if(s[0]=='+') f = true;
int exp = 0, cnt = 0;
bool flag = false;
for(int i=s.length()-1; i>=0; i--){
if(s[i] != '+' && s[i] != '-'){
exp += (s[i]-'0')*pow(10, cnt++);
}
else{
if(s[i] == '+') { //shift right
flag = true;
break;
}
else if(s[i] == '-'){ //shift left
flag = false;
break;
}
}
}
if(flag){ //wrong
res += s[1];
for(int i=3; i<=s.length()-1; i++){
if(s[i] != 'E'){
exp--;
res+=s[i];
}
else{ break;}
}
while(exp--){
res += '0';
}
}
else{
res += s[1];
for(int i=3; i<=s.length()-1; i++){
if(s[i] != 'E'){
res += s[i];
}
else{
break;
}
}
exp-=1;
while(exp--){
res = '0' + res;
}
res = "0." + res;
}
if(!f){
res = '-' + res;
}
cout << res << endl;
return 0;
}
我后来试了一个样例,确实是会超时。不过,找不到具体的原因了,直接贴出正确能够通过的参考代码。感觉我们的思路其实是差不多的,但是他比较机智的一点是先找出E的位置,并且在过程中即可输出结果,而不是像我一样最后再输出。学习了!
1 |
|