1. 程式人生 > >PAT乙級.1024. 科學計數法 (20)

PAT乙級.1024. 科學計數法 (20)

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

PAT連結

思路:

1.讀取字串,將底數單獨提取出來(濾去小數點)

    base[0] = str[1];   //獲得小數點前的數字
    for( i =3; str[i] != 'E'; i++, len_base++)
    {
        base[len_base] = str[i];   //注意:len_base最後比實際多1
    }

2.提取指數字符,獲得指數數字exp

    //獲得指數數字
    i++;
    if
(str[i] == '-') flag = 1; for(i++; str[i] != '\0'; i++) { exp = exp*10; exp += str[i] - '0'; }

3.exp為正,意味著小數點右移,比較exp 與 len_base-1,判斷是否還需要輸出小數點,然後分情況輸出
4.exp為負,意味著小數點左移,要先輸出“0.”計算還需要輸出的0的個數,之後輸出底數base

        if(flag)    //如果指數為負數,向右移位
        {
            printf("0.");
            while
(--exp) printf("0"); for(int k = 0; k<len_base; k++) printf("%c",base[k] ); }

5.exp為0,不需要移位,直接輸出

程式碼:

/**
* @tag     PAT_B_1024
* @authors R11happy (xushuai100@126.com)
* @date    2016-8-23 23:52-0:52
* @version 1.0
* @Language C++
* @Ranking  435/1515
* @function null
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>

int main(int argc, char const *argv[])
{
    int i, len_base=1;
    int index = 0;
    int exp = 0;
    int flag = 0;   //記錄指數正負
    char str[10010];    //一個char 1 byte,9999byte 至少開10000
    char base[10010];
    gets(str);
    if(str[0] == '-')   printf("-");
    base[0] = str[1];   //獲得小數點前的數字
    for( i =3; str[i] != 'E'; i++, len_base++)
    {
        base[len_base] = str[i];   //注意:len_base最後比實際多1
    }
    //獲得指數數字
    i++;
    if(str[i] == '-')   flag = 1;
    for(i++; str[i] != '\0'; i++)
    {
        exp = exp*10;
        exp += str[i] - '0';
    }
    //如果exp不為0, 需要進行移位
    if(exp)
    {
        if(flag)    //如果指數為負數,向右移位
        {
            printf("0.");
            while(--exp)    printf("0");
            for(int k = 0; k<len_base; k++)    printf("%c",base[k] );
        }
        else    //指數為正數,向左移位
        {
            if(exp < len_base-1) //移位後還需要輸出小數點
            {
                //注意index作用域,開始誤寫成int index = 0, 結果對輸入
                //-3.1415926E+4會輸出-31415.31415926
                for(index = 0; index<= exp; index++)    printf("%c",base[index] );
                printf(".");
                for(; index < len_base; index++)   printf("%c",base[index] );
            }
            else    //移位後不用輸出小數點
            {
                for(int k = 0; k < len_base; k++)  printf("%c",base[k] );
                for(int k = 0 ; k < exp - len_base+1; k++)   printf("0");
            }
        }
    }
    //如果exp0,不用移位,直接輸出
    else
    {
        for(int k = 1; str[k] != 'E'; k++)
            printf("%c",str[k] );
    }
    return 0;
}

收穫:

1.一個char佔1byte,9999byte至少要開char [10000]
2.注意i,j,k的作用域