PAT乙級.1024. 科學計數法 (20)
阿新 • • 發佈:2019-01-30
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
思路:
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");
}
}
}
//如果exp為0,不用移位,直接輸出
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的作用域