第一次写题解,这题真的花了我好多时间调试,最后终于通过写随机数据的方式发现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;
}
}