咱就说这个题不难,但是该踩的坑我是一个没少踩。
#关注点#让他的成绩可以在小数点后的任意位置四舍五入。
根据这个关注点可以知道,这里我们不用从后先前逐个进行四舍五入。为了减少次数,我们可以从小数点后的第一位开始,假设在位置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等价,不能与整数进行比较加减。否则可能出现数组越界错误