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

  • 问题描述
    给你两个正的实数A和B,你的任务是计算出A+B的值。
  • 输入说明
    本题目包含T组测试数据。

每一组测试数据在一行里面包含两个长度不大于400的正实数A和B,A和B均无多余的前导0。

  • 输出说明
    对于每一组测试数据,请在一行里面输出输出A+B的值,行首与行尾均无空格。

运算结果最后的0(比如1.400)不需要输出(输出为1.4)。

  • 输入范例
cpp 复制代码
3
1.1 2.9
1.1111111111 2.3444323343
1 1.1
  • 输出范例
cpp 复制代码
4
3.4555434454
2.1

感想:
把字符串划分为整数部分和小数部分;
逆转字符串,给字符串补前导0和后导0;
小数部分相加,进位传给整数部分,整数部分相加;
对相加后的最终结果格式化:去前导0和后导0和不必要的小数点;
输出结果。

代码如下:

cpp 复制代码
#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;
}
相关推荐
寻寻觅觅☆7 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc7 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
l1t7 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿7 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar1238 小时前
C++使用format
开发语言·c++·算法
码说AI8 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS8 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
lanhuazui109 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee449 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
星空下的月光影子9 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言