东华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;
}
相关推荐
练习时长一年4 小时前
@SneakyThrows注解
开发语言
我的xiaodoujiao4 小时前
快速学习Python基础知识详细图文教程14--模块
开发语言·python·学习·测试工具
NoteStream4 小时前
【c语言基础】C语言常见概念
c语言·开发语言·编辑器
吃好睡好便好4 小时前
MATLAB中图像的线性变换
开发语言·图像处理·学习·计算机视觉·matlab
charlie1145141914 小时前
Cinux —— 给物理内存建账本:bitmap 物理内存管理器
开发语言·c++·操作系统·开源项目
ShiXZ2135 小时前
Java 8 Stream API 实用技巧详解:从入门到精通
java·开发语言
冻柠檬飞冰走茶5 小时前
PTA基础编程题目集 7-27 冒泡法排序(C语言实现)
c语言·开发语言·数据结构·算法
听雨入夜5 小时前
“同声传译”还是“全文翻译”?为何HotSpot虚拟机仍要保留解释器?
开发语言·python
随风M记忆s5 小时前
GEE&Python-demo:利用Sentinel-监测北京奥林匹克森林公园年NDVI变化(附Python版)
开发语言·python·sentinel
C++、Java和Python的菜鸟5 小时前
第9章 后端Web进阶(AOP)
java·开发语言·前端