第一次写题解,这题真的花了我好多时间调试,最后终于通过写随机数据的方式发现bug。那一刻的感觉还是很奇妙的。 我的题解相比于其它题解有点麻烦,方法是边读入边处理数据,而不是一次性读入数据然后找小数点。因此这种方法需要的特判会多一些(这也是为什么我调bug的时间很多)。好处是几乎每一个特判都对应一个bug,很适合用来写题解(不是)。

#include <bits/stdc++.h>
using namespace std;
char in[900005];
int main()
{
    int n,m;cin>>n>>m;
    int ii=0;
    in[0]='0';
    for(ii=1;ii<=n;ii++)
    {
        cin>>in[ii];
        if(in[ii]=='.')break;
    }
    int tmp=ii;
    if(ii==n+1)
    {
        for(int i=1;i<ii;i++)cout<<in[i];
        return 0;
    }
    for(ii=ii;ii<n;ii++)
    {
        cin>>in[ii];
        if(in[ii]>'4')break;
    }
    if(ii==n)ii--;
    while(in[ii]>'4'&&m&&ii>=tmp)
    {
        m--;
        in[ii]='0';
        ii--;
        while(in[ii]=='9')
        {
            in[ii]='0';
            ii--;
        }
        in[ii]++;
    }
    if(in[0]!='0')cout<<in[0];
    for(int i=1;i<tmp;i++)cout<<in[i];
    if(ii>=tmp)cout<<'.';
    for(int i=tmp;i<=ii;i++)cout<<in[i];
    return 0;
}

附上一个生成随机数据的代码,可以帮助调试。这里t都设成100了,如果想让t小一些的话可以自己手动改。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    for(int i=1;i<=100;i++)
    {
        int a=rand()%10+1;
        int b=rand()%10+1;
        cout<<a+b+1<<' '<<"100"<<endl;
        for(int j=1;j<=a;j++)
        {
            int c=rand()%10;
            cout<<c;
        }
        cout<<'.';
        for(int j=1;j<=b;j++)
        {
            int c=rand()%10;
            cout<<c;
        }
        cout<<endl;
    }
}