題目來源html
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其知足正則表達式 [+-][1-9].
[0-9]+E[+-][0-9]+,即數字的整數部分只有 1 位,小數部分至少有 1 位,該數字及其指數部分的正負號即便對正數也一定明確給出。ios
現以科學計數法的格式給出實數 A,請編寫程序按普通數字表示法輸出 A,並保證全部有效位都被保留。正則表達式
每一個輸入包含 1 個測試用例,即一個以科學計數法表示的實數 A。該數字的存儲長度不超過 9999 字節,且其指數的絕對值不超過 9999。ide
對每一個測試用例,在一行中按普通數字表示法輸出 A,並保證全部有效位都被保留,包括末尾的 0。測試
+1.23400E-03
0.00123400
-1.2E+10
-12000000000
給定字符串 str ,spa
1. 若是 str[0] == '-' ,就輸出負號code
2. 找到 E 的位置 indexOfE ,將字符串分割成兩個部分 beforeE // 不包括符號位 和 num // 指數 htm
3. 若是指數小於0,先輸出 0. ,再輸出 num - 1 個0,接着輸出 beforeE 中的數字(裏面的小數點不輸出)blog
4. 若是指數大於等於0,先輸出 beforeE[0] ,即小數點前的一個數字。ip
4.1 若是 beforeE 中小數點後的數字長度大於 num ,就將 beforeE 小數點後的 num 個數字輸出,接着輸出小數點,最後輸出剩餘的數字
4.2 若是 beforeE 中小數點後的數字長度等於 num ,就直接輸出 beforeE 小數點後的數字
4.3 若是 beforeE 中小數點後的數字長度小於 num ,就將 beforeE 小數點後的數字輸出,最後輸出 num - beforeE.size() + 1 個0 (+1是由於字符串把小數點的長度也算進去了)
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string str; cin >> str; if (str[0] == '-') { cout << '-'; } int indexOfE = 0; while (str[indexOfE] != 'E') { indexOfE++; } string beforeE = str.substr(1, indexOfE - 1); //從下標1開始,截取indexOfE - 1 個字符 int num = stoi(str.substr(indexOfE + 1)); // 從iindexOfE + 1 到末位的字符串,轉int if (num < 0) { cout << "0."; for (int i = 0; i < abs(num) - 1; ++i) { cout << 0; } for (int i = 0; i < beforeE.size(); ++i) { if (beforeE[i] != '.') { cout << beforeE[i]; } } } if (num >= 0) { cout << beforeE[0]; int len = beforeE.size() - 2; // 小數點後的數字長度 if (len > num) { int cnt = 0; int i = 0; for (i = 2, cnt = 0; i < beforeE.size() && cnt < num; ++i, ++cnt) { cout << beforeE[i]; } cout << '.'; for (int j = i; j < beforeE.size(); ++j) { cout << beforeE[j]; } } else if (len == num) { for (int i = 2; i < beforeE.size(); ++i) { cout << beforeE[i]; } } else if (len < num) { for (int i = 2; i < beforeE.size(); ++i) { cout << beforeE[i]; } for (int i = 0; i < num - len; ++i) { cout << 0; } } } system("pause"); return 0; }