科学计数法(PAT)
1.題目描述:
科學計數(shù)法是科學家用來表示很大或很小的數(shù)字的一種方便的方法,其滿足正則表達式[±][1-9]"."[0-9]+E[±][0-9]+,即數(shù)字的整數(shù)部分只有1位,小數(shù)部分至少有1位,該數(shù)字及其指數(shù)部分的正負號即使對正數(shù)也必定明確給出。
現(xiàn)以科學計數(shù)法的格式給出實數(shù)A,請編寫程序按普通數(shù)字表示法輸出A,并保證所有有效位都被保留。
2.輸入描述:
每個輸入包含1個測試用例,即一個以科學計數(shù)法表示的實數(shù)A。該數(shù)字的存儲長度不超過9999字節(jié),且其指數(shù)的絕對值不超過9999。
3.輸出描述:
對每個測試用例,在一行中按普通數(shù)字表示法輸出A,并保證所有有效位都被保留,包括末尾的0。
4.輸入例子:
+1.23400E-035.輸出例子:
0.001234006.解題思路:
本來打算用字符串輸入,用double類型的變量進行計算以普通數(shù)字輸出,但最后發(fā)現(xiàn)關于double類型的變量無法動態(tài)控制輸出小數(shù)點后的位數(shù)以及多余零的個數(shù),同時double的范圍也不夠支撐大數(shù)據(jù)的輸出,所以只能想到通過字符串輸出來解題。
1. 創(chuàng)建兩個足夠的大的數(shù)組,一個str[N]用于輸入科學計數(shù)法的格式,另一個com[N]用于輸出轉換后的普通數(shù)字表示;
2. 首先我們要把輸入的科學計數(shù)法中字母E之前的字符依次賦值給com[N],對于正數(shù)我們要去掉字符’+’,對于負數(shù)則將E之前都賦值給com[N];
3. 然后判斷str[N]中字母E后面的字符時正號’+‘還是負號’-’,在此間記錄str[N]的長度和字母E后[+ -]字符的位置,通過計算其長度來獲取10的E次方E的數(shù)值;
4. 最后對E的正負號分別判斷,如果是正號’+’,則通過移動數(shù)組中小數(shù)點位置和添加數(shù)據(jù)0操作來進行轉換,如果是負號’-’,則可通過整體向后移動,在小數(shù)點后添加數(shù)據(jù)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)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看历史命令history
- 下一篇: Google kickstart 201