四舍五入
四舍五入
https://ac.nowcoder.com/acm/contest/20960/1004
思路:
首先,从输入中读取n和t,分别表示数字的长度和可以进行的四舍五入次数。
然后,读取输入的字符串s。
接下来,查找小数点的位置dotpos。如果找不到小数点,即dotpos为-1,则直接输出字符串s,并返回。
如果找到了小数点,则将长度len初始化为n。从小数点后面的数字开始遍历。
如果遍历到的数字大于等于5,则将len更新为当前位置,表示从该位置开始将字符串进行截断。同时,将可进行的四舍五入次数t减1,并回退一位继续判断。
如果上一位的数字是4,则将len更新为当前位置,表示从该位置开始将字符串进行截断。同时,将可进行的四舍五入次数t减1,并继续回退一位,直到遇到不是4的数字或者四舍五入次数已经用完。
如果遇到的数字是小数点,则说明已经将小数部分进行了四舍五入,需要对整数部分进行进位。从小数点前一位开始向左遍历,如果遇到9,则将该位置的数字修改为0,并继续向左遍历。如果遇到的数字不是9,则将该位置的数字加1。
最后,通过循环输出截断后的字符串,长度为len。
整个过程完成后,程序结束。
代码
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int n,t;
cin>>n>>t;//n是数的长度包括小数点,t是可以四舍五入的次数
string s;
cin>>s;
int dotpos=s.find(".");
if(dotpos==-1){//没有小数,直接输出
cout<<s;
return 0;
}
int len=n;
for(int i=dotpos+1;i<n;i++){
if(s[i]>='5'){
len=i;
t--;
i--;//看上一个数
while(s[i]=='4'&&t!=0){//上一个数可能是01234,如果是4,那又可以四舍五入
len=i;
t--;
i--;
}
if(s[i]=='.'){//小数全部四舍五入了
len=i;
i--;
while(s[i]=='9'){//整数上是9,可以四舍五入
s[i]='0';
i--;
}
if(i==-1) cout<<'1';//超过小数第一个数,手动设置为1
else s[i]+=1;
}else s[i]+=1;
break;
}
}
for(int i=0;i<len;i++){
cout<<s[i];
}
return 0;
}