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;
}