傳送門
https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168
題目
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式[+-][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
分析
該題主要考查對字符串的劃分和處理。
1.首先要分別記錄開始的正負號,中間的字符串,還有第二個正負號,以及最后的指數。
2.然后考慮兩種處理方法,分別是第二個正負號為正或負的兩種情況,處理方法見源代碼。
類型轉換時我用到了sstream中的stringstream,一般的用法如下:
#include <sstream>
stringstream sstream;
string result = "0010000";
int n = 0;
sstream << result;
sstream >> n; //n = 10000
提示:
在測試的時候,不光要測試樣例,還要把樣例拆開拼湊成新樣例進行測試,可以測試的更全面。
源代碼
//C/C++實現
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main(){
string s;
cin >> s;
int status1 = (s[0] == '+' ? 0 : 1);
int status2 = (s[s.find("E") + 1] == '+' ? 0 : 1);
string index_s = s.substr(s.find("E") + 2, s.size() - s.find("E") - 2);
stringstream sstream;
sstream << index_s;
int index = 0;
sstream >> index;
string num_s = s.substr(1, s.find("E") - 1);
if(status1 != 0){
printf("%c", '-');
}
if(status2 == 1){
for(int i = 0; i < index; ++i){
printf("%c", '0');
if(i == 0){
printf("%c", '.');
}
}
printf("%c", num_s[0]);
for(int j = 2; j < num_s.size(); ++j){
printf("%c", num_s[j]);
}
printf("%c", '\n');
}
else if(status2 == 0){
printf("%c", num_s[0]);
int count = 0;
for(int k = 2; k < num_s.size(); ++k){
if(count == index){
printf("%c", '.');
}
printf("%c", num_s[k]);
++count;
}
for(int l = 0; l < index - count; ++l){
printf("%c", '0');
}
printf("%c", '\n');
}
return 0;
}