PTA:B1024/A1073 科學計數法 。c++

科學計數法

題面:

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式 [±][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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章