#题目
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
HOU, Qiming
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 <math> <semantics> <mrow> <mo> [ </mo> <mo> + </mo> <mo> − </mo> <mo> ] </mo> <mo> [ </mo> <mn> 1 </mn> <mo> − </mo> <mn> 9 </mn> <mo> ] </mo> <mi mathvariant="normal"> " </mi> <mi mathvariant="normal"> . </mi> <mi mathvariant="normal"> " </mi> <mo> [ </mo> <mn> 0 </mn> <mo> − </mo> <mn> 9 </mn> <mo> ] </mo> <mo> + </mo> <mi> E </mi> <mo> [ </mo> <mo> + </mo> <mo> − </mo> <mo> ] </mo> <mo> [ </mo> <mn> 0 </mn> <mo> − </mo> <mn> 9 </mn> <mo> ] </mo> <mo> + </mo> </mrow> <annotation encoding="application/x-tex"> [+-][1-9]"."[0-9]+E[+-][0-9]+ </annotation> </semantics> </math>[+−][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.实数部分
2.指数部分
对于实数部分,除了有“+”号不输出以外,其余全部要保留,唯一区别是根据指数部分的“+”、“-”,把“0”添在实数前面还是添在实数后面
对于指数部分,上面也说了,正负的区别主要是添0的位置,所以我们重点关注它的值
有了大致的思路,我们可以开始了
1.判断第一个符号,为“+”就跳过,为“-”输出"-",
2.设法"保存"中间的实数部分
3.根据指数的正负,决定添0的前后位置
4.根据指数的大小,再具体决定“.”的位置
#代码(cpp)
#include<iostream>
using namespace std;
int main(){
string a;
int k=0;
int len=0;
cin>>a;
if(a[k++]=='-')
cout<<"-";
int start=k;
while(a[k++]!='E');
int end=k-1;
for(int i=k+1;a[i]!='\0';i++)
len = (a[i]-'0')+len*10;
if(len==0)
for(int i=start;i<end;i++)
cout<<a[i];
else if(a[k]=='-'){
cout<<"0.";
for(int i=0;i<len-1;i++)
cout<<0;
for(int i=start;i<end;i++)
if(a[i]!='.')
cout<<a[i];
}
else if(a[k]=='+'){
bool flag = false;
for(int i=start;i<end;i++){
if(a[i]!='.')
cout<<a[i];
else{
flag = true;
continue;
}
if(flag)
len--;
if(len==0 && i!=end-1)
cout<<'.';
}
for(int i=0;i<len;i++)
cout<<0;
}
return 0;
}