这个代码的功能是把给定的数用科学计数法的方式实现
代码来自于《算法笔记》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;
}