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


solution

  • 注意负号的取舍以及进位
    • 只有舍入后非零的负数才会输出负号
    • 可能有多位进位,用高精度加法
  • 测试点2,6:整数
bash 复制代码
1 3
1 8
bash 复制代码
8.000
  • 测试点7:多次进位
bash 复制代码
1 3
3 9.9999
bash 复制代码
10.000
  • 测试点8:舍入后全0的负值
bash 复制代码
1 3
3 -0.0000000001
bash 复制代码
0.000
cpp 复制代码
#include<iostream>
#include<string>
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;
}
相关推荐
Aurorar0rua8 小时前
CS50 x 2024 Notes Arrays - 04
c语言·开发语言·学习方法
Asize8 小时前
数组数据结构底层:从灵活到陷阱
前端·javascript·算法
John_ToDebug8 小时前
Chromium 132→148 升级实战:Legacy IPC 消息丢失问题深度解析
c++·chrome·ai·架构
wuminyu8 小时前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
hairenwangmiao8 小时前
B4041 [GESP202409 四级] 区间排序
算法·排序
人道领域8 小时前
【LeetCode刷题日记】47.全排列Ⅱ
java·开发语言·算法·leetcode
漂流瓶jz8 小时前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点
Navigator_Z8 小时前
LeetCode //C - 1095. Find in Mountain Array
c语言·算法·leetcode
不会就选b9 小时前
算法日常・每日刷题--<二分查找>1
算法
「維他檸檬茶」9 小时前
大模型算法学习2026.6.13
学习·算法