普通数字到科学计数法的转换

这个代码的功能是把给定的数用科学计数法的方式实现

代码来自于《算法笔记》P209

数以string类的形式给出,返回的也是string类,并以引用方式修改了指数e,一开始e=0,其中精度n是全局变量,在函数外声明

这个算法是按指定精度保留了非0的数字
至于需要以什么形式输出m.xxx还是0.xxx需要根据题目情况进行讨论
算法把数分成0.xxxx和m.xxxx来处理的,也就是绝对值大于1和小于1的情况
如果有负数,也要在算法外另行处理,这里处理的是数的绝对值 

string deal(string a,int &e)
{
	//a是待处理数,e是科学计数法的指数 
        //k>a.length()是防止把数字给删光了,至少要保留一个数字 
	int k=0;
	while(a.length()>0&&a[0]=='0')//去除在最前面的0 
		a.erase(a.begin());
	if(a[0]=='.')//去除先导0之后是小数点,说明a是小于1的数 
	{
		a.erase(a.begin());//去掉小数点 
		while(a.length()>0&&a[0]=='0') 
		{
			a.erase(a.begin());//去掉小数点后非零位之前的所有0 
			e--;//每去掉一个0,指数e-- 
		}
	}
	else//去掉先导0后不是小数点,则找到后面的小数点删除 
	{
		while(k<a.length()&&a[k]!='.')//寻找小数点 
		{
			k++;
			e++;
		}
		if(k<a.length())//while结束后k<a.length(),说明遇到了小数点 
			a.erase(a.begin()+k);//删除小数点 
	}
	if(a.length()==0)
		e=0;//去除先导0后a的长度为0,说明这个数是0
	int num=0;
	k=0;
	string res;
	while(num<n)//精度没有达到n 
	{
		if(k<a.length())//只要还有数字,就加到res末尾 
			res+=a[k++];
		else
			res+='0';//否则就res末尾+0 
		num++;//精度+1 
	}
	return res;
}

猜你喜欢

转载自blog.csdn.net/qq_33657357/article/details/82154759