- 问题描述
给你两个正的实数A和B,你的任务是计算出A+B的值。 - 输入说明
本题目包含T组测试数据。
每一组测试数据在一行里面包含两个长度不大于400的正实数A和B,A和B均无多余的前导0。
- 输出说明
对于每一组测试数据,请在一行里面输出输出A+B的值,行首与行尾均无空格。
运算结果最后的0(比如1.400)不需要输出(输出为1.4)。
- 输入范例
3
1.1 2.9
1.1111111111 2.3444323343
1 1.1
- 输出范例
4
3.4555434454
2.1
感想:
把字符串划分为整数部分和小数部分;
逆转字符串,给字符串补前导0和后导0;
小数部分相加,进位传给整数部分,整数部分相加;
对相加后的最终结果格式化:去前导0和后导0和不必要的小数点;
输出结果。
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 反转字符串(辅助函数,方便从低位到高位相加)
string reverseString(const string& s) {
string res = s;
reverse(res.begin(), res.end());
return res;
}
// 拆分实数为整数部分和小数部分
pair<string, string> splitNumber(const string& num) {
size_t dotPos = num.find('.');
string integerPart, decimalPart;
if (dotPos == string::npos) {
integerPart = num;
decimalPart = "";
} else {
integerPart = num.substr(0, dotPos);
decimalPart = num.substr(dotPos + 1);
}
return {integerPart, decimalPart};
}
string add(string a, string b, int& carry) {
string res;
int maxLen = max(a.size(), b.size());
// 补0对齐长度
a.append(maxLen – a.size(), '0');
b.append(maxLen – b.size(), '0');
for (int i = 0; i < maxLen; ++i) {
int digitA = a[i] – '0';
int digitB = b[i] – '0';
int sum = digitA + digitB + carry;
res.push_back((sum % 10) + '0'); //末尾添加单个字符
carry = sum / 10;
}
return res;
}
// 格式化结果(移除末尾0、多余小数点,处理前导0)
string formatResult(const string& integer, const string& decimal) {
string inte = integer;
string dec = decimal;
// 处理整数部分:移除前导0,保留至少一个0
auto firstNonZero = inte.find_first_not_of('0');
if (firstNonZero != string::npos)
inte = inte.substr(firstNonZero);
else
inte = "0";
// 处理小数部分:移除末尾0
if (!dec.empty()) {
auto lastNonZero = dec.find_last_not_of('0');
if (lastNonZero != string::npos)
dec = dec.substr(0, lastNonZero + 1);
else
dec = "";
}
if (dec.empty())
return inte;
else
return inte + "." + dec;
}
string addNumbers(const string& numA, const string& numB) {
string intA = splitNumber(numA).first;
string decA = splitNumber(numA).second;
string intB = splitNumber(numB).first;
string decB = splitNumber(numB).second;
int maxDecLen = max(decA.size(), decB.size());
decA.append(maxDecLen – decA.size(), '0'); // 原小数末尾补0
decB.append(maxDecLen – decB.size(), '0'); // 原小数末尾补0
string revIntA = reverseString(intA);
string revIntB = reverseString(intB);
string revDecA = reverseString(decA);
string revDecB = reverseString(decB);
int carry = 0;//进位
string revDecSum = add(revDecA, revDecB, carry);
string revIntSum = add(revIntA, revIntB, carry);
if (carry) {
revIntSum.push_back(carry + '0');
}
string intSum = reverseString(revIntSum);
string decSum = reverseString(revDecSum);
return formatResult(intSum, decSum);
}
int main() {
int n;
cin>>n;
for (int i = 0; i < n; ++i) {
string a,b;
cin>>a>>b;
string sum = addNumbers(a, b);
cout <<sum<< endl;
}
return 0;
}

网硕互联帮助中心






评论前必须登录!
注册