AcWing 1559. 科学计数法
原题链接
简单
作者:
eveer
,
2021-08-27 17:01:57
,
所有人可见
,
阅读 325
#include<bits/stdc++.h>
using namespace std;
int main()
{
string sci;
cin>>sci;
int sgn=0;//记录数字的正负号
if(sci[0]=='+')sgn=1;
else sgn=-1;
int loc_dot=-1;//记录小数点的位置,初始化为-1,表示不存在小数点;loc_dot=i,表示小数点出现在第i个数字之后
int loc_E=0;//记录指数E的位置
int sgnE=0;//记录指数的符号
int locsgnE=0;
for(int i=1;i<sci.size();i++)
{
if(sci[i]=='.')loc_dot=i-1;
if(sci[i]=='E')loc_E=i;
if(sci[i]=='+')locsgnE=i,sgnE=1;//表示为正指数
if(sci[i]=='-')locsgnE=i,sgnE=-1;//表示为负指数
}
if(loc_dot==-1)//表示其中不存在小数点,则我们将小数点设置到最后
loc_dot=loc_E-1;
vector<int>res;//存储数字
for(int i=1;i<=loc_dot;i++)
res.push_back(sci[i]-'0');
for(int i=loc_dot+2;i<loc_E;i++)
res.push_back(sci[i]-'0');
int n=loc_dot;//n表示E前面数字的位数
int exp=0;//提取出指数部分,即E+/-后的部分
int tmp=1;
for(int i=sci.size()-1;i>=locsgnE+1;i--)
{
exp+=(sci[i]-'0')*tmp;
tmp*=10;
}
int final_exp=n+sgnE*exp;//原来的次数与指数部分的次数相加
int final_loc_dot;//记录最终小数点所在的位置
int len=res.size();
if(final_exp<=0)//最终次数小于等于0,说明要在前面添加0
{
reverse(res.begin(),res.end());//由于vector只能在在末尾添加0,所以我们需要翻转一下
for(int i=1;i<=abs(final_exp)+1;i++)//
res.push_back(0);
reverse(res.begin(),res.end());
final_loc_dot=1;//最终小数点所在的位置就是在第一个0后面
}
else
{
for(int i=1;i<=final_exp-len;i++)
res.push_back(0);
final_loc_dot=n+sgnE*exp;
}
if(sgn==-1)printf("-");
for(int i=0;i<res.size();i++)
{
if(i+1==final_loc_dot&&i!=res.size()-1)printf("%d.",res[i]);
else printf("%d",res[i]);
}
return 0;
}