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