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

一开始想着早上随便做一点的,结果这道题花了我一早上。一开始没想好具体的实现逻辑就开始写了,导致最后写不下去了。下次写之前一定要构思好实现的逻辑,对于这道题:

//n为xxx,e为xx。分别表示子串和指数(不包括正负号)
//1.如果指数小于0,则只需要在小数点后添加指数的绝对值个0
//2.如果指数大于0,若指数大于子串长度,则需要在后面补多余的0,若指数小于子串长度,则在子串中对应位置加小数点。

具体实现过程中还包括不同情况下要不要stoi(),去除最前面的一排0的问题

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;


int main(){
	string n,e,s;
	bool neg_n=0,neg_e=0;
	cin>>s;
	int index = s.find("E");		//index表示E的位置 
	int i;		//spot表示输出时候小数点的位置,number_length表示最后输出数字的长度 
	//检测n和e的正负号 
	if(s[0]=='-'){
		neg_n = 1;
	}
	if(s[index+1]=='-'){	
		neg_e = 1;
	}
		//substr表示截取原串在某下标上长度为xx的一个子串 
		n = s.substr(1,1)+s.substr(3,index-3);
		e = s.substr(index+2,s.length()-index-1);
//	cout<<"n:"<<n<<" e:"<<e<<endl;

	//首先看n带不带负号,带的话直接输出一个负号 
	if (neg_n){
		cout<<"-";
	}
	//然后判断e带不带负号,带的话输出e数量的一串0 
	if (neg_e){
		cout<<"0.";
		for(i=0;i<stoi(e)-1;i++){
			cout<<0;
		}
		cout<<n;
	}
	
	//如果e是正的,就直接输出n 
	else{
		//如果n的长度小于等于e的大小,不用输出小数点 
		if(stoi(e)>=n.length()-1){
			cout<<stoi(n);
			for(i=0;i<stoi(e)-n.length()+1;i++){
				cout<<0;
			}
		}
		else{
			string pre_half =  n.substr(0,stoi(e)+1);
			cout<<stoi(pre_half);
			cout<<".";
			string last_half =  n.substr(stoi(e)+1,n.length()-1);
			cout<<last_half;
		}
	}

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值