链接:登录—专业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#include 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; }



