题目描述:
四舍五入是个好东西。比如你只考了45分,四舍五入后你是50分再四舍五入你就是满分啦!qdgg刚考完拓扑。成绩十分不理想。但老师觉得他每天都很认真的听课很不容易。于是决定给他一个提高成绩的机会:让他的成绩可以在小数点后的任意位置四舍五入(也可以四舍五入为最接近的整数)。
但是这是有限制的。qdgg只能四舍五入t次。请帮助qdgg找到他在不超过t次四舍五入可获得的最高成绩。请注意,他可以选择不使用全部t次机会。此外,他甚至可以选择完全不对成绩进行四舍五入。
在这个问题中,使用经典的舍入规则:将数字四舍五入到第n个数字时,必须先看一下数字n + 1,如果小于5,则第n个数字将保持不变,而所有后续数字替换为0。否则,如果n + 1位数大于或等于5,则位置n处的位数将增加1(如果此位数等于9,这也可能会更改其他一些位数),并且随后的所有位数数字将替换为0。最后,所有尾随的零将被丢弃。
例如,如果将数字1.14舍入到小数点后第一位,则结果为1.1,而如果将1.5舍入到最接近的整数,则结果为2。四舍五入到小数点后第五位的数字1.299996121将得出数字1.3。
题目链接:
https://ac.nowcoder.com/acm/problem/200369
思路:
参考:https://ac.nowcoder.com/acm/problem/blogs/200369
首先要知道,四舍五入只能进行在小数部分,这也是为什么要用find。
其次,如果进行了一次四舍五入,那么后边的数字就都变成0了。
也就是说,不考虑进位的情况下,最多进行一次四舍五入操作。
那么如果考虑进位,在第一个大于“5”的位置,进行了四舍五入,可能会发生一系列连锁反应,导致一条进位链。
故思路如下:
#include
#include
#include
using namespace std;
int main()
{
int n,t;
cin>>n>>t;
string str;
cin>>str;
int pos=str.find('.');
if(pos==-1)
{
cout<<str;
return 0;
}
for(int i=pos+1;i<str.size();i++)
{
if(str[i]>='5')
{
str[i]='x';
t--;
i--;
while(str[i]=='4' && t)
{
str[i]='x';
i--;
t--;
}
if(str[i]=='.')
{
str[i]='x';
i--;
while(str[i]=='9')
{
str[i]='0';
i--;
}
}
if(i==-1)
{
cout<<1;
}
else
{
str[i]+=1;
}
break;
}
}
for(int i=0;i<str.size();i++)
{
if(str[i]=='x')
{
break;
}
cout<<str[i];
}
}