1024 科學計數法 (20)(20 分)
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式[+-][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
解題思路:
本題不算難題,但確實是一道煩題,主要就是考察對字符串的操作以及對細節的把握,分類討論是否嚴謹等。首先容易想到先將科學計數法的字符串分割,得到底數的符號,底數,指數的符號,指數這四部分,具體的討論這位仁兄思路跟我基本一樣,可參考https://blog.csdn.net/qq_37729102/article/details/81736497
記錄一下我開始審題時候踩的幾個坑,我看樣例指數的符號就兩位,下意識認爲指數就兩位,轉換就錯了,應該是不僅限於兩位的。指數還可能是0,需要分出來討論,但是經檢測題目的測試樣例並沒有在這挖坑。滿足正則表達式 [+-][1-9].[0-9]+E[+-][0-9]+,審題務必仔細,這裏底數的整數部分是[1-9],不取0,例如就不會是+0.12E+03,這就少了一大部分討論
代碼
#include<iostream>
#include<string>
using namespace std;
string symbol1,dishu,symbol2,index;//分別是底數的符號,底數,指數的符號,指數
int changeExp(string index){//把指數由字符串變爲數
//int exp=(index[0]-'0')*10+(index[1]-'0');就兩位數的寫法
int exp=0,base=1;
for(int i=index.length()-1;i>=0;--i){
exp+=base*(index[i]-'0');
base*=10;
}
return exp;
}
void change(int exp){
if(exp==0)
cout<<dishu;
else{
if(symbol2=="-"){
cout<<"0.";
for(int i=0;i<exp-1;++i)
cout<<0;
dishu.erase(dishu.find('.'),1);
cout<<dishu;
}else if(symbol2=="+"){
string integer=dishu.substr(0,1);
string decimal=dishu.substr(1,dishu.length()-2);
if(integer!="0"){//其實可以不用判斷,題目整數部分取值1-9
if(decimal.size()<=exp){//例子:1.253E3==>1253
exp-=decimal.size();
dishu.erase(dishu.find('.'),1);
cout<<dishu;
for(int i=0;i<exp;++i)
cout<<0;
}else{//例子:1.253E2==>125.3
dishu.insert(2+exp,".");
dishu.erase(dishu.find('.'),1);
cout<<dishu;
}
}
}
}
}
int main(){
string str;
cin>>str;
symbol1=str.substr(0,1);
dishu=str.substr(1,str.find('E')-1);
symbol2=str.substr(str.find('E')+1,1);
index=str.substr(str.find('E')+2,str.length());
//cout<<symbol1<<' '<<dishu<<' '<<symbol2<<' '<<index;
int exp=changeExp(index);
if(symbol1=="-")
cout<<symbol1;
change(exp);
}