四舍五入

四舍五入

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;
}
全部评论

相关推荐

腾讯 文心一言 腾讯总包高5w
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务