PAT-B 1024 科学计数法
https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168
题目
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].
[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
输入
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
输出
对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。
样例输入
+1.23400E-03
样例输出
0.00123400
分析
模拟+字符串,注释很清楚,具体看程序。
C++程序
#include<iostream>
using namespace std;
const int N=10005;
int main()
{
char s1,s2;//s1数符,s2阶符
char M[N],E[N];//M[]尾数,E[]指数
s1=getchar();//读入数符
int k1=0,k2=0;//分别表示M[]、E[]的元素个数
int pos=-1;//表示小数点的位置
char ch;
while((ch=getchar())!='E')
{
if(ch=='.')
{
pos=k1;//小数点在第k1个数字后面
continue;
}
M[k1++]=ch;
}
s2=getchar();//读入阶符
while((ch=getchar())!='\n')
E[k2++]=ch;
//计算指数的值
int t=0;
for(int i=0;i<k2;i++)
t=t*10+E[i]-'0';
if(s1=='-') putchar(s1);//当数符为负的时候才输出
int sum=pos+(s2=='+'?t:-t);//要输出的整数部分的位数
if(sum<=0)//位数为负,表明要前补零
{
int temp=-sum;
//位数不够,补零
printf("0.");
for(int i=0;i<temp;i++)
putchar('0');
for(int i=0;i<k1;i++)
putchar(M[i]);
}
else if(0<sum&&sum<=k1)
{
for(int i=0;i<k1;i++)
{
if(i==sum) putchar('.');//小数点在第sum个数的后面
putchar(M[i]);
}
}
else//大于k1,表明要后补零
{
for(int i=0;i<k1;i++)
putchar(M[i]);
//补零
for(int i=k1;i<sum;i++)
putchar('0');
}
putchar('\n');
return 0;
}