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);
}