7-3舍入
说一下它特殊的测试点吧
1.考虑前导0情况
2.考虑首位正负情况
3.考虑输入无小数点情况
4.考虑精确小数点为0位情况
5.考虑最高位需要进位情况,例如9.9999这样的
再来说下它要求的相关事项的细节
1.四舍五入
题目说的是精确数的后边一位如果是>=5就舍入,其实按照题目根本来说,比如一个数3.44444445,如果我d = 3,那么我就只要管3.4444了,得到答案就是3.444?按照题目来说,不是…得从最近一位能舍入的开始…然后一直向前得到3.445
2.去四进六双五
和上边一样,和你玩文字游戏,比如3.444500001,d = 3
并不是只要考虑3.44450这串数字…
对于后边一位是5的情况来说,只要后边出现非0项,就能舍入…
因此答案应该是3.445
说了这么多,我还是喜提19分…
附上参考代码…
#include <iostream>
using namespace std;
int jw(int a[],int top,int idx) //从idx开始进位
{
int jww = 1;
for(int i=idx;i >= 0;i--)
{
a[i] += jww;
jww = a[i]/10;
a[i]%=10;
}
return jww;
}
int main()
{
int n,d;
cin>>n>>d;
while(n--)
{
int cho;int a[205],top = 0;
string s;
int pos = -1; //标记小数点的位置
cin>>cho>>s;
if(s[0] == '-')
{
cout<<s[0];
s = s.substr(1,s.length()-1);
}
else if(s[0] == '+')
s = s.substr(1,s.length()-1);
//消除前导0
int i=0;
while(i < s.length() && s[i] == '0')
i++;
s = s.substr(i,s.length()-i);
if(s[0] == '.')//0.00
{
string ss = "0";
ss += s;
s = ss;
}
//else 0000x.000
if(s.length() == 0)
{
cout<<0;
if(d)
{
cout<<'.';
for(int i=0;i<d;i++)
cout<<'0';
}
cout<<'\n';
continue;
}
for(int i=0;i<s.length();i++)
{
if(s[i] == '.')
{
pos = i;
continue;
}
a[top++] = s[i]-'0';
}
if(pos == -1) //说明没有小数点
{
cout<<s;
if(d)
{
cout<<'.';
for(int i=0;i<d;i++)
cout<<'0';
}
cout<<"\n";
continue;
}
//下面是输入数据有小数点的
//如果小数点后面的位数不够,还是要补0
if(top - pos <= d)//top-pos表示现在拥有的位数个数
{//要补0的情况
for(int i=0;i<pos;i++)
cout<<a[i];
if(d)
{
cout<<'.';
for(int i=pos;i<top;i++)//输出已有的
cout<<a[i];
for(int i=top-pos;i<d;i++)
cout<<'0';
}
cout<<'\n';
continue;
}
if(cho == 2) //删除后边的
{
for(int i=0;i<pos;i++)
cout<<a[i];
if(d)//如果需要保留小数
{
cout<<'.';
for(int i=pos;i<d+pos;i++)
cout<<a[i];
}
cout<<'\n';
continue;
}
else if(cho == 1)//四舍五入
{
int k = 0,i;//代表最后是否要加一位
for(i=pos+d;i<top;i++)
if(a[i] >= 5)
{
int f = jw(a,top,i-1);
if(!k)
k = f;
}
if(k)
cout<<1;
for(int i=0;i<pos;i++)//d+pos表示最后一位有效位的后一位
cout<<a[i];
if(d)
{
cout<<'.';
for(int i=pos;i<pos+d;i++)
cout<<a[i];
}
cout<<'\n';
continue;
}
else//舍四进六双五
{
int k = 0;
int flag = 0;
if(d+pos < top && a[d+pos] >= 6)
flag = 1;
else if(d + pos < top && a[d+pos] == 5)
{
int i;
for(i=d+pos+1;i<top;i++)
if(a[i] != 0)
{
flag = 1;
break;
}
if(i == top)
{
if(a[d+pos-1]&1)//最后一位是单数
flag = 1;
}
}
if(flag)
k = jw(a,top,d+pos-1);
if(k)
cout<<1;
for(int i=0;i<pos;i++)//d+pos表示最后一位有效位的后一位
cout<<a[i];
if(d)
{
cout<<'.';
for(int i=pos;i<pos+d;i++)
cout<<a[i];
}
cout<<'\n';
continue;
}
}
}