科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其知足正則表達式 [+-][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. 利用字符串對數字的讀入;正則表達式
2. 對符號的判斷,正號沒必要輸出,負號必須輸出;測試
3. 對指數的討論,先把字符串轉化爲整數後分正負分別計算;spa
(1).指數爲負,則在符號位後直接輸出‘0.’,而後在小數點與第一位非0數之間插‘0’,沒必要再次輸出小數點;blog
(2).指數爲正,則判斷原字符串在小數點和E之間的長度len與指數exp的大小,再判斷小數點的位置。字符串
// PAT_1024_科學計數法 # include <stdio.h> # include <string.h> # include <stdlib.h> # define Max 100000 int main(void) { char S[Max], S_num[Max]; int i=0, j=0, exp, len=0; gets(S); // puts(S); // 輸出該數字的符號(數沒必要輸出) if (S[0] == '-') printf("%c",S[0]); while (S[i]!='E') i++; // 提取E後面的數字 strcpy(S_num, S+i+1); // puts(S_num); // 轉化爲整型數字 exp = atoi(S_num); // printf("%d\n",exp); // 指數分正負討論,負數時 if (exp<0) { printf("0."); // 在小數點後面輸出0 for (j=exp; j<-1; j++) printf("0"); // 輸出正負號到E之間的除小數點外的字符 for (i=1; S[i]!='E'; i++) { if (S[i]!='.') printf("%c",S[i]); } } // 指數爲正時 else { // 記錄小數點到E之間的字符串長度 for (i=2; S[i]!='E'; i++) { if (S[i]!='.') len++; } // 長度 // printf("%d\n",len); // 比較 指數exp 和 長度len 的大小 // exp>len 在最後補零,不用輸出 小數點 if (exp >= len) { for (i=1; S[i]!='E'; i++) { if (S[i]!='.') printf("%c",S[i]); } for (i=0; i<exp-len; i++) printf("0"); } // exp < len 在第exp位輸出小數點 else { for (i=1; S[i]!='E'; i++) { if (S[i] != '.') printf("%c",S[i]); if (i==exp+2) printf("."); } } } return 0; }
RRRget