PAT 乙级真题 1014.科学计数法

PAT 乙级真题 1014.科学计数法

题目描述

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分
只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。

输入格式

每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。

输出格式

对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。

输入样例

+1.23400E-03

输出样例

0.00123400

题目思路

暴力算法,E后为负数时输出时往前面补0,E后为正数时,将字符数组向后移位处理。

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

const int N = 1e4 + 10;
char a[N], b[N];

int main()
{
	scanf("%s", a);
	if (a[0] == '-')printf("-");
	int i = 1, seed = 0, m = 0;
	while (a[i] != 'E')
	{
		b[i - 1] = a[i];
		i++;
	}
	int len = i - 2;
	if (a[++i] == '+')
		seed = 1;
	m += a[++i] - 48;
	while (a[++i])
	{
		m *= 10;
		m += a[i] - 48;
	}
	i = 0;
	while (b[i++] != '.');
	int j = i - 1;
	if (seed)
	{
		while (j < i + m - 1) {
			b[j] = b[j + 1];
			j++;
		}
		b[i + m - 1] = '.';
		i = i + m - 1;
		m = i;
		for (; i >= 0; --i)
		{
			if (b[i] == '')b[i] = '0';
		}
		if (m - 1 > len)
		{
			b[m] = '';
		}
		else
		{
			for (j = m; j < len + 1; j++)
			{
				if(b[j]=='')
					b[j] = '0';
			}
			b[j] = '';
		}
		printf("%s", b);
	}
	else
	{
		swap(b[0], b[1]);
		if (m == 1)
		{
			printf("0%s", b);
		}
		else
		{
			printf("0.");
			for (i = 1; i < m; i++)printf("0");
			printf("%s", b+1);
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/fsh001/p/12229529.html