科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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’的位置来判断指数符号‘EX’,小数点的位置来判断数字在小数点前后的位数,有如下情况:
1.EX为负,小数点向前移,前面数字有(pos-beg)位
(1). (pos-beg)>(-EX) 此时不需要在前面补0
(2). 要在前面补0
2.EX为正,小数点向后移,后面数字有(end-pos)位
(1). (end-pos)>=(EX) 此时不需要在后面补0
(2). 要在后面补0
#include<iostream>
#include<cstring>
using namespace std;
void prin(char *a,int beg,int end){
for(int i=beg;i<=end;i++){
cout<<a[i];
}
}
int main(){
char fuhao1,fuhao2; //一个是数的符号,一个是指数的符号
cin>>fuhao1;
if(fuhao1=='-')cout<<'-'; //负号输出,正号不输出
char num[9999];
cin>>num;
int len=strlen(num);
int pos=len; //小数点位置
int beg=0,end=len-1;//数字开始-结束位置
int EX=0; //EX的大小,也就是小数点要向前/后移动多少位
int pd=1; //EX的符号
int i,k=end,z;
for(i=0;i<len;i++){ //获取位置
if(num[i]=='.') pos=i;
if(num[i]=='E') {
end=i-1;
switch(num[i+1]){ //E后面的符号
case '+': pd=1;break;
case '-': pd=-1;break;
}
i=i+2;
while((k+1)!=i){ //开始计算EX
EX=EX*10+(num[i]-'0');
i++;
}
break;
}
}
//cout<<beg<<' '<<end<<' '<<pos<<' '<<EX;
//1.EX为负,小数点向前移,前面数字有(pos-beg)位
// 1). (pos-beg)>(-EX) 此时不需要在前面补0
// 2). 要在前面补0
//2.EX为正,小数点向后移,后面数字有(end-pos)位
// 1). (end-pos)>=(EX) 此时不需要在后面补0
// 2). 要在后面补0
if(pd<0){ //EX为负
if((pos-beg)>EX){
/*for(i=0;i>EX;i--){ //向前移EX位
k=num[i+pos];
num[i+pos]=num[i+pos-1];
num[i+pos-1]=k;
}*/
prin(num,beg,pos-EX-1);
if(pos!=len)cout<<'.'; //小数点后面有数
prin(num,pos-EX,pos-1);
prin(num,pos+1,end);
}
else{
cout<<"0.";z=EX-pos-beg;
while(z--) cout<<'0';
prin(num,beg,pos-1);
prin(num,pos+1,end);
}
}
//+0.023E+02 02.3
else{ //EX为正
if((end-pos)>EX){
if(!(pos-1==beg && num[beg]=='0')) //特别注意0.几的情况,此时向右移不能保留这个0
{
prin(num,beg,pos-1);
prin(num,pos+1,pos+EX);
}
else{
k=pos;
while(num[k+1]=='0')k++;
prin(num,k+1,pos+EX);
}
bool tag=true;
for(i=beg;i<=pos+EX;i++)
if(num[i]!='0')tag=false;
if(!tag)cout<<'.';
prin(num,pos+1+EX,end);
}
else{
if(!(pos-1==beg && num[beg]=='0')) //特别注意0.几的情况,此时向右移不能保留这个0
prin(num,beg,pos-1);
prin(num,pos+1,end); z=EX-(end-pos);
while(z--) cout<<'0';
}
}
return 0;
}