四舍五入
思路及注意点:
- 只需要找到小数点后第一个>=5的数,从他开始进位就是。例如1.56789 ,直接从5开始进位变成1.6就行了,后面不管有多少>=5的数,全都变成0了,没法也没必要再进位了,而且还能满足四舍五入完是最大数的要求
- 会有直接是整数的情况
- 只能在小数点后四舍五入,不能126.456直接四舍五入成130,应该是126.5。小数点后进位影响到整数位的情况是可以允许的,不能直接对整数部分四舍五入
#include <iostream>
#include <cstring>
using namespace std;
string s;
int n, t;
int len;//四舍五入完最后字符串的长度
int main()
{
cin >> n >> t >> s;
//题目没有明说 但是确实会有不带小数点直接是个整数的情况出现
int pos = s.find('.');
if(pos == -1)//如果是个整数直接输出
{
cout << s;
return 0;
}
len = n;//一开始什么都没有修改 字符串还是原来的长度
for(int i = pos + 1; i < n; i ++)//从小数点后面的数开始
{
if(s[i] >= '5')//只要找到第一个>=5的数就行了,后面的都不用管
{
len = i;
t --, i --;//修改次数-1,然后去看前一个数
//前面说了我们只需要找到第一个>=5的数就行了,所以满足这个条件的数前面只可能是01234
//而只有上一个数为4的情况才能再向前进位
while(s[i] == '4' && t != 0)
{
len = i;
t --, i --;//再去看上一位是不是还能再进位
}
//如果已经移动到小数点了的话,看看整数部分会不会受到小数部分进位的影响
if(s[i] == '.')
{
len = i; i --;
while(s[i] == '9')//只有9才能向上一位进位,其他>=5的数直接+1就行
{
s[i] = '0';//当前位变为0
i --;//再去看上一位是不是9
}
//9进位完当前位变成0上一位+1,如果么有上一位手动输出1
if(i == -1) cout << '1';
else s[i] += 1;
}
else s[i] += 1;//如果上一位不是小数点也不是4的话直接+1就行了,进位也就到此结束了
break;
}
}
for(int i = 0; i < len; i ++)
cout << s[i];
return 0;
}