PAT 1024. 科學計數法
阿新 • • 發佈:2017-12-20
ret 輸入 處理 begin log 正則表達 說明 保留 ron
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式[+-][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
就這道破題差點讓我心態爆炸〒▽〒,不是因為難,而是因為我因為最後輸出時不管加號減號都要加在開頭輸出,結果是只有減號
獨留在風中淩亂的我╮(╯▽╰)╭
下面是代碼
#include<iostream> #include<algorithm> #include<string.h> using namespace std; bool Iszero(char c){ return c==‘0‘; } int main(){ string num,zhishu; // num用來儲存輸入,zhishu為了後面保存string形式的E的指數 zhishu.resize(4); // 沒有這一步,copy(it+1,num.end(),zhishu.begin())是錯的,因為copy的輸入序列至少能保存下copy的內容啊 cin>>num; int point_num=0; //point_num記錄小數位有多少位 char c=num[0]; // 用來保存正負號 auto it=find(num.begin(),num.end(),‘E‘); // 利用包含在頭文件<algorithm>中的find函數返回指向E的叠代器 copy(it+1,num.end(),zhishu.begin()); // copy‘E‘之後的指數部分進入zhishu num.erase(it,num.end()); //把num中E到最後的部分刪掉 point_num=num.length()-3; //小數位位數 int zhishu2=stoi(zhishu); //把string形式的指數轉化為int point_num-=zhishu2; //拿原來的小數位數減去指數,如果為負的,說明沒有小數點了並且要在後面加零。為正的說明結果的小數位數 num.erase(find(num.begin(),num.end(),‘.‘)); // 刪除原來的小數點 if(point_num>0){ if(point_num>=num.length()-1) num.insert(num.begin()+1,point_num-(num.length()-1)+1,‘0‘); num.insert(num.end()-point_num,1,‘.‘); } else{ num.insert(num.end(),-point_num,‘0‘); } //下面是處理結果前面可能存在無意義的零,比如001.003, 000.002 等等 ******************************************************** auto point=find(num.begin(),num.end(),‘.‘); if(point!=num.end()){ it=find_if_not(num.begin()+1,point,Iszero); if(it==point) num.erase(num.begin(),it-1); else num.erase(num.begin(),it); } else{ it=find_if_not(num.begin()+1,num.end(),Iszero); num.erase(num.begin(),it); } *********************************************************** if(c==‘-‘) // 望讀者不要和我一樣?(ˉ﹃ˉ?) num.insert(num.begin(),1,c); cout<<num<<endl; return 0; }
PAT 1024. 科學計數法