PAT 1024. 科学计数法
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
就这道破题差点让我心态爆炸〒▽〒,不是因为难,而是因为我因为最后输出时不管加号减号都要加在开头输出,结果是只有减号
独留在风中凌乱的我╮(╯▽╰)╭
下面是代码
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
bool Iszero(char c){
return c=='0';
}
int main(){
string num,zhishu; // num用来储存输入,zhishu为了后面保存string形式的E的指数
zhishu.resize(4); // 没有这一步,copy(it+1,num.end(),zhishu.begin())是错的,因为copy的输入序列至少能保存下copy的内容啊
cin>>num;
int point_num=0; //point_num记录小数位有多少位
char c=num[0]; // 用来保存正负号
auto it=find(num.begin(),num.end(),'E'); // 利用包含在头文件<algorithm>中的find函数返回指向E的迭代器
copy(it+1,num.end(),zhishu.begin()); // copy'E'之后的指数部分进入zhishu
num.erase(it,num.end()); //把num中E到最后的部分删掉
point_num=num.length()-3; //小数位位数
int zhishu2=stoi(zhishu); //把string形式的指数转化为int
point_num-=zhishu2; //拿原来的小数位数减去指数,如果为负的,说明没有小数点了并且要在后面加零。为正的说明结果的小数位数
num.erase(find(num.begin(),num.end(),'.')); // 删除原来的小数点
if(point_num>0){
if(point_num>=num.length()-1)
num.insert(num.begin()+1,point_num-(num.length()-1)+1,'0');
num.insert(num.end()-point_num,1,'.');
}
else{
num.insert(num.end(),-point_num,'0');
}
//下面是处理结果前面可能存在无意义的零,比如001.003, 000.002 等等
********************************************************
auto point=find(num.begin(),num.end(),'.');
if(point!=num.end()){
it=find_if_not(num.begin()+1,point,Iszero);
if(it==point) num.erase(num.begin(),it-1);
else num.erase(num.begin(),it);
}
else{
it=find_if_not(num.begin()+1,num.end(),Iszero);
num.erase(num.begin(),it);
}
***********************************************************
if(c=='-') // 望读者不要和我一样ԅ(¯﹃¯ԅ)
num.insert(num.begin(),1,c);
cout<<num<<endl;
return 0;
}