PAT 1024. 科学计数法

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;
} 
posted @ 2017-12-20 19:12  A-Little-Nut  阅读(289)  评论(0编辑  收藏  举报