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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章