2995. 科学计数法

Mr.wu_

“我向来是不惮以最坏的恶意来推测中国人的,然而我还不料,也不信竟会凶残到这地步。”

Saitama

感谢爱丽丝兹贝库鲁的支援,我稍微做了一点删改,并写了一点注释

#include <bits/stdc++.h>
using namespace std;
int tail;//末尾10的指数
void func(string &s)//处理进位
{
    s='0'+s;//在字符串之前添加一个0预防99+1之类的情况发生
    for(int i=s.size()-1;i>=0;i--)
    {
        if(++s[i]>'9')
            s[i]='0';
        else
            break;
    }
    if(s[0]=='0')
        s.erase(0,1);//之前添加的前置0没用则去掉
    else
        tail++;//用到了的话tail++
}
void solve()
{
    string s;
    int n;
    cin>>s>>n;
    tail=0;
    int flag1=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='.')
        {
            flag1=1;
            break;
        }
    }
    if(flag1==0)
        s+='.';//放后面等着
    if(s[0]=='0')
    {
        int i;
        for(i=2;i<s.size()&&s[i]=='0';i++,tail--)
            ;
        tail--;
        s.erase(0,i);
    }//这样的话就不用专门输出负号了
    else
    {
        int k=0;
        for(;k<s.size();k++)
        {
            if(s[k]=='.')
                break;
        }
        tail=k-1;
        s.erase(k,1);//'.'删了,这个添上有删掉感觉很没意思但是主要娶一个tail值就这么下来了。。。
    }
    while(s.size()<=n)
        s+='0';
    if(s[n]>='5')
    {
        s=s.substr(0,n);
        func(s);
        s=s.substr(0,n);//这里应该也可以在改进一些
    }
    else
        s=s.substr(0,n);
    s.insert(1,".");
    if(tail)
        cout<<s<<"F"<<tail<<endl;
    else
        cout<<s<<endl;
}
int main()
{
    int T;
    cin>>T;
    for(int i=0;i<T;i++)
    {
        printf("case #%d:\n",i);
        solve();
    }
    return 0;
}
CCXXXI_

在楼上Saitama大佬的基础上精简了下代码(以稍微上升的时间&空间开销为代价,但这不重要)

#include<bits/stdc++.h>
using namespace std;
auto const P(30);
int main()
{
    int T; cin >> T;
    for(int cs = 0; cs < T; cs++)
    {
        cout << "case #" << cs << ":\n";
        string m; int p; cin >> m >> p; m = "0" + m; // 开头补个0防溢出
        int b = 0;
        if(auto dot = m.find('.'); dot != m.npos)
        {
            b = dot - m.length() + 1;
            m.erase(dot, 1);
        }
        m += string(P, '0'); b -= P; // 不管精度够不够,末尾先补它30个0
        auto nz = m.find_first_not_of('0'); // nz: not_zero
        b += m.length() - nz - 1;
        m[nz + p - 1] += m[nz + p] >= '5';
        for(int i = nz + p - 1; m[i] > '9'; i--)
        {
            m[i] -= 10; m[i - 1] += 1;
        }
        if(m[nz - 1] - '0') // 把类似10.0F1的情况改成1.0F2
        {
            nz -= 1; b += 1;
        }
        cout << m[nz] << ".";
        for(size_t i = nz + 1; i < nz + p; i++)cout << m[i];
        if(b)cout << "F" << b;
        cout << "\n";
    }
}
Master X

小数系列还有这道毒瘤题,诶………………

你当前正在回复 博客/题目
存在问题!