东华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;
}
相关推荐
樱木Plus6 小时前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_3 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星3 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛5 天前
delete又未完全delete
c++
端平入洛6 天前
auto有时不auto
c++
郑州光合科技余经理7 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1237 天前
matlab画图工具
开发语言·matlab
dustcell.7 天前
haproxy七层代理
java·开发语言·前端
norlan_jame7 天前
C-PHY与D-PHY差异
c语言·开发语言