一、题目描述
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
二、题目分析
题目要求给出科学计数法计数,输出原来的数字。
建议直接模拟。
将底数与指数分离,然后输出
三、思路与代码
1.思路
- 判断正负数,若负数则输出负号 -
- 获取底数与指数的分界线,E的位置
- 根据指数为正负分类讨论
若指数为负,则先根据指数补0,补完0后输出原来的底数
若指数为正,则需要判断底数位数与指数的大小
如1.2E+10 底数位数<指数位数,则补0
如1.234E+2,底数位数>指数位数,小数点后移,输出123.4 - 按要求输出
2.代码
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string str;
cin >> str;
int n = str.length();
//1.正负数符号输出
if (str[0] == '-')
printf("-");
//2.找到E的位置,来对指数以及原本的数进行分界
int pos = -1;
for (int i = 1; i < n; i++)
{
if (str[i] == 'E')
{
pos = i;
break;
}
}
//3.判断指数正负
//3.1如果是负指数
if (str[pos + 1] == '-')
{
int a = 0;
//求指数
for (int i = pos + 2; i < n; i++)
{
a = a * 10 + str[i] - '0';
}
//输出指数,补0
printf("0.");
for (int i = 1; i < a; i++)
{
printf("0");
}
//补完0后输出原来的数字,注意.不能输出
for (int i = 1; i < pos; i++)
{
if (str[i] != '.')
printf("%c", str[i]);
}
}//如果是正整数
else if (str[pos + 1] == '+')
{
//求指数
int a = 0;
for (int i = pos + 2; i < n; i++)
{
a = a * 10 + str[i] - '0';
}
//判断底数小数点之后的位数和指数的大小
int i;
for (i = 1; i < a + 3 && i < pos; i++)
{
if (str[i] != '.')
printf("%c", str[i]);
}
//如果底数小数点之后的位数<指数,如1.2E10,则补0
while (i < a + 3)
{
printf("0");
i++;
}
//如果底数小数点之后的位数>指数,如1.2345E+02,则为123.45,要补小数点
if (i < pos)
{
printf(".");//补小数点
for (i; i < pos; i++)
{
printf("%c", str[i]);
}
}
}
return 0;
}