云计算百科
云计算领域专业知识百科平台

东华OJ-基础题-109-大实数加法(C++)-难度难

  • 问题描述
    给你两个正的实数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;
}

在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » 东华OJ-基础题-109-大实数加法(C++)-难度难
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!