PAT 乙級 1024.科學計數法 C++/Java

題目來源html

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其知足正則表達式 [+-][1-9].[0-9]+E[+-][0-9]+,即數字的整數部分只有 1 位,小數部分至少有 1 位,該數字及其指數部分的正負號即便對正數也一定明確給出。ios

現以科學計數法的格式給出實數 A,請編寫程序按普通數字表示法輸出 A,並保證全部有效位都被保留。正則表達式

輸入格式:

每一個輸入包含 1 個測試用例,即一個以科學計數法表示的實數 A。該數字的存儲長度不超過 9999 字節,且其指數的絕對值不超過 9999。ide

輸出格式:

對每一個測試用例,在一行中按普通數字表示法輸出 A,並保證全部有效位都被保留,包括末尾的 0。測試

輸入樣例 1:

+1.23400E-03
 

輸出樣例 1:

0.00123400
 

輸入樣例 2:

-1.2E+10
 

輸出樣例 2:

-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是由於字符串把小數點的長度也算進去了)

 

C++實現:

#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;
}
View Code

 

 

 

 

Java實現:

相關文章
相關標籤/搜索