1073 Scientific Notation (20 分)

参考\(\color{green}{yxc}\)的代码,感觉写法有些秒。

主要思想是定位字母E的位置,然后就可以很容易识别左边小数的终止位置和右边指数的正负号和绝对值exp。在定位字母E的位置pos后,按指数正负分两种情况讨论:

  1. 指数为负:应该注意到,这种情况一定是输出0.00...0XXX,其中小数点后连续的0的个数为exp-1,而后面XXX的部分即为字母E的前面所有数字。
  2. 指数为正:主要需要考虑小数点移动后的位置。
    • 小数点移动后在数的的最右边或移动到最右边后末尾仍需补一定数量的\(0\)
    • 小数点移动后在数的中间

题目中提到了“该数字的存储长度不超过9999Byte",由于一个char变量需要1Byte来存储,因此9999Byte就说明这个数字的长度不超过9999。

string s;

int main()
{
    cin>>s;

    if(s[0] == '-') cout<<'-';

    int pos=s.find('E');
    int e=stoi(s.substr(pos+1));

    string res=s[1]+s.substr(3,pos-3);

    if(e < 0)
    {
        res="0."+string(abs(e)-1,'0')+res;
    }
    else
    {
        if(e+1 >= res.size()) res+=string(e+1-res.size(),'0');
        else res=res.substr(0,e+1)+'.'+res.substr(e+1);
    }

    cout<<res<<endl;
   //system("pause");
    return 0;
}
上一篇:每天一道算法题:正则表达式匹配


下一篇:js中截取字符串的三个方法 substring()、substr()、slice()及charAt() 方法