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