PAT 1073

题目 : Scientific Notation

分值 : 20
难度 : 中等题
思路 : 根据指数,移动小数点 或者后面补零 
坑点 : 这道题20分真的过分了,有点烦的,虽然情况不多,但是太多的小细节,分分钟想上天.

具体代码如下

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
#include <iostream>
#include <string>
using namespace std ;
string deal(string s, int &e)
{
e = 0 ;
while(s[0]=='0' && s.size() >0)s.erase(s.begin() ) ; // 去 头部的 0
//while(s[s.size() -1]=='0' &&s.size()>0 ) s.erase(s.end()) ;// 去 尾部的 0
if(s[0]=='.')
{
s.erase(s.begin()) ;
e -= s.size() ;
while(s[0]=='0'&&s.size()>0) s.erase(s.begin());
}
else
{
int cur = 0 ;
for(int i =0; i< s.size() ; i++)
if(s[i]=='.')
cur = i ;
e = -(s.size() -1 - cur) ;
s.erase(s.begin()+cur);
}
return s ;
}
int main() {
string s ;
cin >>s ;
int FH=0 , ZFH = -1 ;
if(s[0]=='+') FH =1 ;
int XSDpos =1 ,Epos =1 ;
for(int i = 1 ;i< s.size() ; i++)
{
if(s[i]=='.')
XSDpos= i ;
if(s[i] =='E')
{
Epos = i ;
break ;
}
}
if(s[Epos+1] =='+' ) ZFH=1 ;
int sum = 0;
for(int i= Epos+2 ; i<s.size() ; i++)
{
sum =sum *10 + s[i]-'0' ;
}
sum *= ZFH ;
string temp = s.substr(1,Epos-1) ;
int ee ;
temp =deal(temp ,ee) ;
sum+=ee ;
if(!FH)
cout <<"-";
if(sum>=0)
{
cout <<temp ;
for(int i = 0 ; i< sum ;i++)
cout <<"0";
cout <<endl ;
}
else
{
if(-sum >= temp.size())
{
cout <<"0.";
for(int i=0 ; i< -sum -temp.size() ;i++)
cout<<"0";
cout <<temp<<endl ;
}
else
{
temp.insert(temp.size()+sum,".");
cout << temp<<endl;
}
}

}