PAT--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

分析
看不懂题干的话,可以从输入输出样例看出,有一个数字本身的符号+数字,还有一个指数的符号+指数的位置。其实最后就是要根据数字本身符号(’+‘不显示,’-'显示);数字本身;指数符号和指数值组成一个数,我们通过‘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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值