1. 程式人生 > >PAT 1024. 科學計數法

PAT 1024. 科學計數法

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. 科學計數法