本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168
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
分析:
本题处理起来确实麻烦,但你是不需要字符串函数来处理的。首先你需要找到E的位置,从E的位置+1往后计算指数大小EX,EX就表示需要在小数部分前或后加EX个0,然后判断第1个字符是不是负号,是则输出。再判定EX即0的长度是否为0,如果为0则输出从1开始到E之前位置的字符即可,如果EX不为0,则有如下两种情况:
1.EX>0
首先输出整数部分,然后需要判定小数部分长度和EX的大小,又分两种情况:
1.1 EX<小数部分长度
输出下标从3即小数部分第1个数字的位置开始EX个长度的字符,如果用for循环输出,假设循环变量为j,EX也即0的长度为len0,则条件为j=3,j<3+len0,j++,注意,3+len0不要写成j=j+len0!否则j的上限不断变化,到时候可能会越界!然后输出小数点,再输出小数点到E之间的部分,注意循环变量的初始值为3+len0
1.2 EX>=小数部分长度
先输出从下标3开始到E的部分,假设小数部分长度为D,则输出EX-D个长度的0
2.EX<0
先输出0和小数点,再输出EX-1长度的0,再输出原整数部分即第2个字符,再输出下标从3开始到E的部分
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int len0=0;
cin>>s;
for(int i=0;i<s.length();i++)
if(s[i]=='E')//找到E
{
for(int j=i+2;j<s.length();j++)
len0=len0*10+(s[j]-'0');//计算指数即需要增加的0的长度
if(s[0]=='-')
cout<<'-';
if(len0==0)//若指数为0
{
for(int j=1;j<i;j++)//输出下标从1开始到E的串
cout<<s[j];
}
else if(s[i+1]=='+')//若指数为正
{
cout<<s[1];//输出整数部分
if(len0<i-3)//若0的长度小于小数部分长度
{
for(int j=3;j<3+len0;j++)//输出下标从3开始的0的长度的部分
cout<<s[j];
cout<<'.';//输出小数点
for(int j=3+len0;j<i;j++)//输出小数点后到E之间的部分
cout<<s[j];
}
else//若0的长度大于等于小数部分长度
{
for(int j=3;j<i;j++)//输出下标从3开始到E的部分
cout<<s[j];
for(int j=1;j<=len0-(i-3);j++)//输出0长度-小数部分长度的0
cout<<0;
}
}
else//若指数为负
{
cout<<"0.";//输出0和小数点
for(int j=1;j<len0;j++)//输出0长度-1的0
cout<<0;
cout<<s[1];//输出原整数部分
for(int j=3;j<i;j++)//输出原小数部分
cout<<s[j];
}
return 0;
}
}