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
分析:
n保存E之后的数字,t保存E之前的字符串
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;cin>>s;
int i=0;
while(s[i]!='E') i++;
//t保存E前面的字符串,但不包括符号位,符号位直接单独判断
string t=s.substr(1,i-1);
//n保存E之后的数字,并把它转为int型,后面要用来计算
int n=stoi(s.substr(i+1));
if(s[0]=='-') cout<<"-";
//n<0表示小数点向左移动,最后的输出格式一定是0.00....
if(n<0){
cout<<"0.";
//输出移动多少位的0
for(int j=0;j<abs(n)-1;j++) cout<<"0";
//把原数加到后面,注意要跳过小数点
for(int j=0;j<t.size();j++){
if(t[j]!='.') cout<<t[j];
}
} else{
//当是原数扩大时
//先输出第一位数,把小数点跳过
cout<<t[0];
int j,cnt;
//向右移动小数点有两种情况:一种是移动位数较少,小数点还存在;
//另一种是小数点已经移出去了,要在数字后面补0
//但第一步都是先将n位内尽可能多的输出原数字
for(j=2,cnt=0;j<t.size()&&cnt<n;j++,cnt++)
cout<<t[j];
//当已经把原数输出完了,但n还有剩余(即小数点还要往右移)
if(j==t.size()){
for(int k=0;k<n-cnt;k++)
cout<<"0";
} else{
//当扩大的倍数已经用完,但原数还有剩余
//就先输出小数点
cout<<".";
//再输出剩余的数
for(int k=j;k<t.size();k++)
cout<<t[k];
}
}
return 0;
}