• 1123 舍入(测试点2,6,7,8)


    在这里插入图片描述
    在这里插入图片描述

    solution

    • 注意负号的取舍以及进位
      • 只有舍入后非零的负数才会输出负号
      • 可能有多位进位,用高精度加法
    • 测试点2,6:整数
    1 3
    1 8
    
    8.000
    
    • 测试点7:多次进位
    1 3
    3 9.9999
    
    10.000
    
    • 测试点8:舍入后全0的负值
    1 3
    3 -0.0000000001
    
    0.000
    
    #include
    #include
    using namespace std;
    int main(){
    	int n, d, com, cnt, minus, all, carry, point, p, need, have, i, t;
    	string s;
    	cin >> n >> d;
    	while(n--){
    		cnt = minus = all = carry = point = p = need = have = 0;
    		cin >> com >> s;
    		if(s[0] == '-'){
    			minus = 1;
    			s.erase(0, 1);
    		}
    		while(p < s.size() && s[p] != '.') p++;//找到小数点位置
    		if(p < s.size() && com != 2){//处理进位
    			if(com == 1 && p + d + 1 < s.size() && s[p + d + 1] > '4') need = 1;
    			else if(com == 3 && p + d + 1 < s.size() && s[p + d + 1] > '4'){
    				if(s[p + d + 1] > '5') need = 1;
    				else{
    					for(int i = p + d + 2; i < s.size() && !have; i++){
    						if(s[i] >= '1' && s[i] <= '9') have = 1;
    					}
    					if(have || (s[p + d] - '0') % 2 == 1) need = 1;
    				}
    			}
    			carry = need;
    			for(int i = p + d; i >= 0 && need; i--){//高精度加法
    				if(s[i] == '.') continue;
    				t = s[i] - '0' + carry;
    				s[i] = t % 10 + '0';
    				carry = t / 10;
    			}
    			if(carry) s = "1" + s;//最高位仍有进位时,数字前加一
    		}
    		for(int i = 0; i < s.size() && i < p + d && !all; i++){//是否全0
    			if(s[i] >= '1' && s[i] <= '9') all = 1;
    		}
    		if(all && minus) cout << "-";//不是全0且有负号,才输出负号
    		for(i = 0; i < s.size() && i <= p + d; i++){
    			cout << s[i];
    		}
    		if(p == s.size()) {//整数时,添加小数点(D是正整数,所以一定需要输出小数点)
    			cout << ".";
    			p--;
    		}
    		while(i - p <= d + carry){//不足D位则补0
    			cout << "0";
    			i++;
    		}
    		cout << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    Caliburn.Micro框架学习笔记——事件总线机制
    jmeter请求接口问题小记
    java计算机毕业设计智慧机场管理系统源码+数据库+系统+部署+lw文档
    Flink / Scala - 使用 Jedis、JedisPool 作为 Source 读取数据
    Unity3d bounds包围盒 和collider碰撞器区别
    js中new的原理
    git rebase和merge区别
    React拖拽实践
    结合pyttsx3与pynput模拟实现自动发送qq消息
    使用Net将HTML简历导出为PDF格式
  • 原文地址:https://blog.csdn.net/Moliay/article/details/139468425