科学计数法(PAT)
1.題目描述:
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式[±][1-9]"."[0-9]+E[±][0-9]+,即數字的整數部分只有1位,小數部分至少有1位,該數字及其指數部分的正負號即使對正數也必定明確給出。
現以科學計數法的格式給出實數A,請編寫程序按普通數字表示法輸出A,并保證所有有效位都被保留。
2.輸入描述:
每個輸入包含1個測試用例,即一個以科學計數法表示的實數A。該數字的存儲長度不超過9999字節,且其指數的絕對值不超過9999。
3.輸出描述:
對每個測試用例,在一行中按普通數字表示法輸出A,并保證所有有效位都被保留,包括末尾的0。
4.輸入例子:
+1.23400E-035.輸出例子:
0.001234006.解題思路:
本來打算用字符串輸入,用double類型的變量進行計算以普通數字輸出,但最后發現關于double類型的變量無法動態控制輸出小數點后的位數以及多余零的個數,同時double的范圍也不夠支撐大數據的輸出,所以只能想到通過字符串輸出來解題。
1. 創建兩個足夠的大的數組,一個str[N]用于輸入科學計數法的格式,另一個com[N]用于輸出轉換后的普通數字表示;
2. 首先我們要把輸入的科學計數法中字母E之前的字符依次賦值給com[N],對于正數我們要去掉字符’+’,對于負數則將E之前都賦值給com[N];
3. 然后判斷str[N]中字母E后面的字符時正號’+‘還是負號’-’,在此間記錄str[N]的長度和字母E后[+ -]字符的位置,通過計算其長度來獲取10的E次方E的數值;
4. 最后對E的正負號分別判斷,如果是正號’+’,則通過移動數組中小數點位置和添加數據0操作來進行轉換,如果是負號’-’,則可通過整體向后移動,在小數點后添加數據0元素來進行操作。
7.源代碼:
#include<stdio.h> #include<math.h> #define N 10000 int main() {int i,j,k,n=0;double m=0,E=0;char c,str[N]="\0",com[N]="\0";//步驟1scanf("%s",str);for(i=0;str[i]!='\0';i++)//步驟2{if(str[i]=='E'){j=i+1;break;}elseif(str[0]=='+'&&str[i+1]!='E')com[i]=str[i+1];elseif(str[0]=='-'&&str[i]!='E')com[i]=str[i];}while(str[i]!='\0')//步驟3{i++;}for(k=i-1;k>j;k--)//步驟3E+=(str[k]-48)*(pow(10,n++));m=E;if(str[j]=='+')//步驟4{for(k=1;k<m+2;k++)if(com[k]=='.'&&com[k+1]!='\0'&&E!=0){c=com[k];com[k]=com[k+1];com[k+1]=c;E--; }elseif(com[k]=='.'&&com[k+1]=='\0'&&E!=0){com[k]='0';E--;}elseif(com[k]=='\0'&&E!=0){com[k]='0';E--;}}elseif(str[j]=='-'&&E!=0){for(k=0;k<3;k++)if(com[k]=='.'){c=com[k-1];com[k-1]=com[k];com[k]=c;break;}for(k=j-1;com[k]!='.';k--)com[k]=com[k-1];com[k]='0';E--;while(E!=0){for(k=j;com[k-1]!='.';k--)com[k]=com[k-1];com[k]='0';j++;E--;}}printf("%s",com);return 0; }總結
以上是生活随笔為你收集整理的科学计数法(PAT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看历史命令history
- 下一篇: [Linux]history命令用法详解