咱就说这个题不难,但是该踩的坑我是一个没少踩。
#关注点#:让他的成绩可以在小数点后的任意位置四舍五入。
根据这个关注点可以知道,这里我们不用从后先前逐个进行四舍五入。为了减少次数,我们可以从小数点后的第一位开始,假设在位置i+1有五入的处理,这里有以下几种情况需要考虑:
1、若i 的值是四,那么可以继续五入并继续检查i-1是否为4,如果为4那么继续进行五入。
2、i的值为小数点,那么将此位置为结束位。同时查看i-1位即小数点前一位的值
b.i-1的值不为9,该位加1.
a.i-1位的值为9,那么将该位置置0,向前进1;如果首位为9加1那么先输出一个1在输出数字。
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
int n,t;
cin >> n >> t >> str;
int pos = str.find('.');
if(pos == str.npos) {
cout << str;
return 0;}
for(int i = pos+1; i < n; i++){
if(str[i] >= '5'){
str[i] = 'x';
t--;
i--;
while(str[i] == '4'&& t){
str[i] = 'x'; //用x代表结束位
t--;
i--;
}
if(str[i] == '.'){
str[i] = 'x';
i--;
while(str[i] == '9'){
str[i] = '0';
i--;
}
if(i == -1) cout <<'1';
else str[i] += 1;
}
else str[i] += 1;
break;
}
}
for(int i = 0; i < str.length(); i++){
if(str[i] == 'x') break;
cout << str[i];
}
}
#易错点#
1、string类型中‘\0’不作为结束标志,相反可以作为一个字符存在于string中
2、string 中的npos可以看做实数但是不意味着它和-1等价,不能与整数进行比较加减。否则可能出现数组越界错误



京公网安备 11010502036488号