科學計數法
題面:
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式 [±][1-9].[0-9]+E[±][0-9]+,即數字的整數部分只有 1 位,小數部分至少有 1 位,該數字及其指數部分的正負號即使對正數也必定明確給出。
現以科學計數法的格式給出實數 A,請編寫程序按普通數字表示法輸出 A,並保證所有有效位都被保留
每個輸入包含 1 個測試用例,即一個以科學計數法表示的實數 A。該數字的存儲長度不超過 9999 字節,且其指數的絕對值不超過 9999
對每個測試用例,在一行中按普通數字表示法輸出 A,並保證所有有效位都被保留,包括末尾的 0。
sample input:
+1.23400E-03
sample output:
0.00123400
sample input:
-1.2E+10
sample output:
-12000000000
思路:
- 對於每一個用科學計數法表示的數字都可以看成兩個部分,字母E的前面部分和後半部分的指數部分,在定位字母E的位置pos之後,可以按照指數的正負進行情況的劃分和模擬
- 如果指數爲負,則一定會輸出0.00…0xxxx的情況,小數點之後連續的0的數量是指數的絕對值exp-1,輸出完0之後輸出字母E前面的數字
- 如果指數爲正,需要考慮小數點移動之後所在的位置。小數點和E之間的數字的個數一定是pos-3(3個位置中符號,小數點前值,小數點各佔一位)。如果pos-3恰好等於右移的位數exp,則不需要輸出小數點。如果exp較大,那就需要額外輸出exp-(pos-3)個0
- 特判如果指數爲0則相當於直接輸出原來的數
AC代碼:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
char str[10001];
cin>>str;
int len=strlen(str);
if(str[0]=='-')
printf("-");//如果是個負數,上來輸出負號
int pos=0;
while(str[pos]!='E')
pos++;
int exp=0;
for(int i=pos+2;i<len;i++)//首先記錄指數的值
{
exp=exp*10+(str[i]-'0');
}
if(exp=='0')//如果指數爲0,這個相當於乘1
for(int i=1;i<pos;i++)
{
printf("%c",str[i]);
}
if(str[pos+1]=='-')//指數爲負
{
printf("0.");
for(int i=0;i<exp-1;i++)
printf("0");
for(int i=1;i<pos;i++)
{
if(str[i]!='.')
printf("%c",str[i]);
}
}
else//指數爲正開始判斷小數點位置和後面數的關係
{
for(int i=1;i<pos;i++)
{
if(str[i]!='.')
printf("%c",str[i]);
if(i==exp+2&&pos-3!=exp)//小數點位置在exp+1並且小數點與E之間的個數不能小於右移位數
printf(".");
}
for(int i=0;i<exp-(pos-3);i++) printf("0");
}
return 0;
}