'只要坚持就会成功 -- 2022.1.12'
题目描述
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
成绩可以在小数点后的任意位置四舍五入(也可以四舍五入为最接近的整数)。
四舍五入t次
输入描述
输入的第一行包含两个整数n和t(1 ≤ n ≤ 200000, 1 <= t <= 10 ^ 9)表示小数(含小数点)的长度以及四舍五入的次数。
第二行 为一个字符串表示初始分数。
输出描述
一行表示能得到的最高分数(请勿输出尾零)
示例1
输入
6 1
10.245
输出
10.25
示例2
输入
6 2
10.245
输出
10.3
示例3
输入
3 100
9.2
输出
9.2
思路:
1. 从小数点后边找到第一个>=5的数进行四舍五入,如果找不到则直接输出即可
2. 详细见代码。
#include<iostream>
#include<string>
using namespace std;
int n, t;
string s;
int main()
{
cin >> n >> t >> s;
int pos = s.find('.');//找到小数点的位置;
if(pos == s.npos)//npos是一种函数,许多容器都提供这个东西,用来表示不存在的位置;
{
cout << s;//如果没有小数点,即该数为一个整数,所以不需要操作,直接输出即可;
return 0;
}
for(int i = pos + 1; i < n; i ++)//从小数点后的第一位开始枚举;
{
if(s[i] >= '5')//因为qdgg想要提高分数,所以需要找到第一个>=5的数,去四舍五入,从而最能提高成绩;
{
s[i] = 'x';//我们在这里用x当作结尾,用于结束输出;
t --;//因为t >= 1 所以第一次不需要看此时t是否 >= 1;
i --;//前移一位,继续后面的操作;
while(s[i] == '4' && t)//因为有可能一位原本是4,进位后变成了5,所以又可以继续四舍五入;
{
s[i] = 'x';
t --;
i --;
}
if(s[i] == '.')//此时是小数点的下一位进位成5,要四舍五入进位的情况(也可以四舍五入为最接近的整数);
{
s[i] = 'x';
i --;
while(s[i] == '9')//查看该位是否是9,如果是9的话,加上之前进位的1,就可以再次进位;
{
s[i] = '0';
i --;
}
if(i == -1)//如果一直进位到整数进一位,例如 99 进位 到 100;
{
cout << 1;//需要先输出1;
}
else s[i] += 1;//如果加一位的话,则就正常最高位加一即可;
}
else s[i] += 1;//如果没到小数点就四舍五入完毕,则直接该位加上上一位的1即可;
break;//四舍五入完成;
}
}
for(int i = 0; i < s.length(); i ++)
{
if(s[i] == 'x')break;//利用之前的结尾标记,输出结果;
cout << s[i];
}
cout << endl;
return 0;
}