1024 科学计数法 (20)(20 分)

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
作者: HOU, Qiming
单位: PAT联盟
时间限制: 100ms
内存限制: 64MB
代码长度限制: 16KB

这道题其实 百度上大神那可是玩出花样了。可我水平不及。只能用中规中矩的方法,按照我们平时做题一样移项出解。所以代码会长,不过还得真的好好研究一下 百度上的算法才行,不能故步自封也是学习的方法吧!

AC代码:

#include <bits/stdc++.h>
using namespace std;

void solve() {

	vector<int>ZS, XS;
	int pd = 0;
	int nt;
	char f='+';
	for (char s; s = getchar(), s != 'E';) {
		if (s == '+' || s == '-')
			f = s;
		else if (s != '.') {

			if (!pd)
				ZS.push_back(s - '0');
			else
				XS.push_back(s - '0');
		}
		else
			pd = 1;
	}
	scanf("%d", &nt);
	if (nt < 0) {
		for (int i = 0, j = -nt; i < j; i++) {
			if (!ZS.empty()) {
				XS.insert(XS.begin(), ZS[ZS.size() - 1]);
				ZS.erase(ZS.begin()+ZS.size()-1);
			}
			else {
				XS.insert(XS.begin(), 0);
			}
		}
	}
	else if (nt > 0) {
		 for (int i = 0, j = nt; i < j; i++) {
			if (!XS.empty()) {
				ZS.insert(ZS.begin() + ZS.size(),XS[0]);
				XS.erase(XS.begin());
			}
			else {
				ZS.insert(ZS.begin() + ZS.size(), 0);
			}
		}
	}
	if(f!='+')
		printf("%c", f);

	if (ZS.empty() && !XS.empty())  // 如果小数存在且整数不存在
		printf("0.");
	else if (!ZS.empty() && !XS.empty()) { // 如果小数整数都存在
		for (int i = 0, j = ZS.size(); i < j; i++)
			printf("%d",ZS[i]);
		printf(".");
	}
	else if(!ZS.empty()){ // 不满足 2 则 考虑是不是 整数存在
		for (int i = 0, j = ZS.size(); i < j; i++)
			printf("%d",ZS[i]);
	}
	else {
		printf("0"); // 整数小数都不存在就是 0 了
	}

	for (int i = 0, j = XS.size(); i < j; i++) {
		printf("%d", XS[i]);
	}

}

int main() {

	solve();
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值