1. 程式人生 > >PAT(Basic)乙級---1024(20 分) 科學計數法

PAT(Basic)乙級---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

程式碼一:(第4測試點過不去不知道為啥)

#include <iostream>
#include <math.h>
using namespace std;

int findE(string str,int N){    //找到字串E所在下標值 
	for(int i=0;i<N;i++){
		if(str[i]=='E') return i;
	}
}
int main(){
 	string str;
 	cin >> str;
 	int length = str.length();
 	int index = findE(str,str.length());
 	int sum=0;
 	int exp=0;
 	for(int i=length-1;i>=index+2;i--){  //得到指數值 
 		sum+=(str[i]-'0')*pow(10,exp);
 		exp++;
 	}
 	
 	//開始輸出
	 if(str[0]=='-') cout << "-";
	 if(sum==0){  //指數為0 
	 	for(int i=1;i<index;i++){
	 		cout<<str[i];
	 	} 
	 }else if (str[index+1] =='-'){   //指數為負 
	 	cout << "0.";
	 	for(int i=1;i<=sum-1;i++){     //補0 
	 		cout << "0";
	 	}
	 	for(int i=1;i<index;i++){
	 		if(str[i]!='.'){
	 			cout<<str[i];
	 		}	
	 	} 
	 }else if(str[index+1]=='+'){	 //指數為正 
	 	int k = index-3;			       //.到E之間數的個數 
	 	if(sum>=k){					          //判斷移動位數是否大於小數個數
	 		for(int i=1;i<index;i++){   
	 		if(str[i]!='.'){
	 			cout<<str[i];
	 			}	
	 		}
		 for(int i=1;i<=sum-k;i++){  //補0 
		 	  cout<<"0";
		 }
	 	}else{
	 		for(int i=1;i<index;i++){ //輸出輸出sum位數 ,然後輸出小數點 
	 			if(str[i]!='.') cout<<str[i];
	 			if(i==sum+3) cout <<'.'<<str[i] ;
	 		}
	 	} 
	 	 
	 }
}

程式碼二:

#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
const int maxn=10000;
char s[maxn];
int main(){
    memset(s,'\0',sizeof(s));
    cin>>s;
    int len=strlen(s);
    int index_e=0;
    for(int i=0;i<len;i++){ //第一步
        if(s[i]=='E'){
            index_e=i;
            s[i]='\0';
            break;
        }
    }
    int a=atoi(s+index_e+1),i;  //第二步
    //cout<<a<<endl;
    if(s[0]=='-') cout<<'-'; //細節
    if(a==0) cout<<s+1;  //第三步
    else if(a>0){
        int len1=index_e-2-1;
        if(a>=len1){
            cout<<s[1]<<s+3;
            for(int i=0;i<a-len1;i++) cout<<0;
        }else{
            cout<<s[1];
            for(i=3;i-3<a;i++) cout<<s[i];
            cout<<'.'<<s+i;
        }
    }else if(a<0){
        a=-a;
        cout<<"0.";
        for(int i=0;i<a-1;i++) cout<<0;
        cout<<s[1]<<s+3;
    }
    return 0;
}

參考:http://https://blog.csdn.net/qq_27474589/article/details/76104318

總結:

  • 主要要找到E的位置並得到指數的大小。然後討論指數為0,正,負這三種情況,其中指數為正又分需要補零和不用補零兩種情況。