1. 程式人生 > >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

#include <iostream>
#include "cstring"

using namespace std;

int getInt(int begin, int end, const char *str) {
  
  int result = 0;

  for (int i = begin; i <= end; i++) {
    result *= 10;
    result += str[i] - '0';
  }
  return result;
}

int main() {

  char str[9999];
  int xsBegin = 0, xsEnd = 0;
  int zF, jF;

  scanf("%s", str);

  int i = 0;
  for(i = 0; i < strlen(str); i++) {
    if (str[i] == '.') {
      xsBegin = i + 1;
    }
    if (str[i] == 'E') {
      xsEnd = i - 1;
      break;
    }
  }

  if (str[0]=='-') {
    printf("-");
  }

  int xsInt = xsEnd - xsBegin + 1;
  int jsInt = getInt(xsEnd + 3, strlen(str)-1, str) ;

  if (str[xsEnd + 2]=='-') { // 指數為負的情況
    // 小數點向前移動jsInt位
    printf("0.");
    for(i=0;i<jsInt-1;i++){
      printf("0");
    }
    //輸出正數部分
    printf("%c",str[1]);
    //輸出小數部分
    for(i=xsBegin;i<=xsEnd;i++){
      printf("%c",str[i]);
    }
  }else {  // 指數為正的時候
  
    //jsInt > xsInt
    if(jsInt>=xsInt) {
      // 輸出正數
      printf("%c",str[1]);
      // 輸出小數
      for(i=xsBegin;i<=xsEnd;i++){
        printf("%c",str[i]);
      }
      // 輸出多餘的0
      for(i=0;i<jsInt-xsInt;i++){
        printf("0");
      }
    }else {
      // 輸出正數
      printf("%c",str[1]);
      // 輸出jsInt個小數      
      for(i=xsBegin;i<xsBegin +jsInt ;i++){
        printf("%c",str[i]);
      }
      // 輸出小數點
      printf(".");
      // 輸出餘下的小數
      for(;i<=xsEnd ;i++){
        printf("%c",str[i]);
      }
    }


  }



  return 0;
}