PAT_B 1024 科學計數法 (20分)

1024 科學計數法 (20)(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


解題思路:

       本題不算難題,但確實是一道煩題,主要就是考察對字符串的操作以及對細節的把握,分類討論是否嚴謹等。首先容易想到先將科學計數法的字符串分割,得到底數的符號,底數,指數的符號,指數這四部分,具體的討論這位仁兄思路跟我基本一樣,可參考https://blog.csdn.net/qq_37729102/article/details/81736497

記錄一下我開始審題時候踩的幾個坑,我看樣例指數的符號就兩位,下意識認爲指數就兩位,轉換就錯了,應該是不僅限於兩位的。指數還可能是0,需要分出來討論,但是經檢測題目的測試樣例並沒有在這挖坑。滿足正則表達式 [+-][1-9].[0-9]+E[+-][0-9]+,審題務必仔細,這裏底數的整數部分是[1-9],不取0,例如就不會是+0.12E+03,這就少了一大部分討論

代碼

#include<iostream>
#include<string>
using namespace std;
string symbol1,dishu,symbol2,index;//分別是底數的符號,底數,指數的符號,指數

int changeExp(string index){//把指數由字符串變爲數
	//int exp=(index[0]-'0')*10+(index[1]-'0');就兩位數的寫法
	int exp=0,base=1;
	for(int i=index.length()-1;i>=0;--i){
		exp+=base*(index[i]-'0');
		base*=10;
	}
	return exp;
}
void change(int exp){
	if(exp==0)
		cout<<dishu;
	else{
		if(symbol2=="-"){
			cout<<"0.";
			for(int i=0;i<exp-1;++i)
				cout<<0;
			dishu.erase(dishu.find('.'),1);
			cout<<dishu;
		}else if(symbol2=="+"){
			string integer=dishu.substr(0,1);
			string decimal=dishu.substr(1,dishu.length()-2);
			if(integer!="0"){//其實可以不用判斷,題目整數部分取值1-9
				if(decimal.size()<=exp){//例子:1.253E3==>1253
					exp-=decimal.size();
					dishu.erase(dishu.find('.'),1);
					cout<<dishu;
					for(int i=0;i<exp;++i)
						cout<<0;
				}else{//例子:1.253E2==>125.3
					dishu.insert(2+exp,".");
					dishu.erase(dishu.find('.'),1);
					cout<<dishu;
				}
			}
			
		}
	}
}
int main(){
	string str;
	cin>>str;
	symbol1=str.substr(0,1);
	dishu=str.substr(1,str.find('E')-1);
	symbol2=str.substr(str.find('E')+1,1);
	index=str.substr(str.find('E')+2,str.length());
	//cout<<symbol1<<' '<<dishu<<' '<<symbol2<<' '<<index;
	int exp=changeExp(index);
	if(symbol1=="-")
		cout<<symbol1;
	change(exp);
}

 

發佈了13 篇原創文章 · 獲贊 30 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章