zoukankan      html  css  js  c++  java
  • 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;
    } 
    
  • 相关阅读:
    Vimdiff的用法 简单
    VIM插件使用 简单
    张子阳:大道至简,职场上做人做事做管理 简单
    VIM常用快捷键整理 简单
    从程序员到项目经理(四):外行可以领导内行吗 简单
    从程序员到项目经理(三):认识项目经理 简单
    余波:技术人员如何走出职业迷茫 简单
    技术路线的选择重要但不具有决定性 简单
    转:我在Facebook工作的十大经验分享 简单
    linux下vim的编译以及终端乱码的解决方案 简单
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/8075408.html
Copyright © 2011-2022 走看看