C++利用string实现高精度加法运算

阿澈
阿澈
发布时间:2026-10-14| 1人浏览过
原创

当数值超出标准整数类型的范围时,常规方法失效。本文详细解析如何通过 C++ 的 string 类型结合数组模拟思想,实现两个超大整数的精确相加。

设计思路与前置准备

对于极大整数的运算,直接使用 long long int 等原生数据类型会溢出。解决此问题的核心思路是:将数字以字符串形式存储,模拟人工竖式加法的过程,即从低位到高位逐位相加并处理进位。

关键步骤:

  1. 数据读取:输入的大整数直接作为 std::string 存储。
  2. 对齐顺序:为了方便从“个位”开始计算,通常将字符串反转,使索引 0 对应最低位。
  3. 核心运算:遍历公共长度部分,计算本位之和与新的进位值。
  4. 剩余处理:处理较长字符串剩余的位数,直至结束。

第1步:定义辅助函数(字符/整数互转)

在进行算术运算前,需要将字符型的 '0'-'9' 转换为对应的整数 int,计算完成后再转回字符型。

int charToInt(char c){
    return c - '0'; // ASCII码相减得到实际数值}

char intToChar(int n){
    return '0' + n; // 加上 '0' 的 ASCII 码恢复为字符}

第2步:字符串反转工具函数

由于 string 默认是正序存储(例如 "123"),而计算需要从末尾(3)开始,因此需要反转操作。以下代码演示了如何将字符串从头到尾插入到新字符串的前端。

string reverseStr(string input){ 
    string output = ""; 
    for(int i = 0; i < input.length(); i++){ 
        output.insert(output.begin(),input[i]); 
    } 
    return output; 
}

第3步:高精度加法核心逻辑

加法函数 sumofStr 负责执行实际的叠加逻辑。其工作流程如下:

参数接收与初始化: 接收两个原始字符串,并在内部进行反转操作以统一为从低位到高位的视角。设定 pMax 为两个字符串长度的最小值,用于循环计算公共部分;同时初始化进位标志 carry = 0。

string sumofStr(string _s1, string _s2){ 
    string s1 = reverseStr(_s1); 
    string s2 = reverseStr(_s2); 
    
    // 获取较短的长度作为公共部分的边界
    int pMax = s1.length() > s2.length() ? s2.length() : s1.length(); 
    string sumStr = ""; 
    int carry = 0; // 进位
    int temp = 0;

    // 1. 处理两个数共有的低位部分
    for(int p = 0; p < pMax; p++){ 
        temp = charToInt(s1[p]) + charToInt(s2[p]) + carry; 
        carry = temp / 10; // 更新进位值
        sumStr.insert(sumStr.begin(),intToChar(temp % 10)); // 当前位结果插入头部
    }

    // 2. 处理 s1 多出的高位部分
    if(p < s1.length()){ 
        for(; p < s1.length(); p++){ 
            temp = charToInt(s1[p]) + carry; 
            carry = temp / 10; 
            sumStr.insert(sumStr.begin(),intToChar(temp % 10)); 
        } 
    }

    // 3. 处理 s2 多出的高位部分
    if(p < s2.length()){ 
        for(; p < s2.length(); p++){ 
            temp = charToInt(s2[p]) + carry; 
            carry = temp / 10; 
            sumStr.insert(sumStr.begin(),intToChar(temp % 10)); 
        } 
    }

    // 4. 如果最后还有进位,追加最高位
    if(carry > 0){ 
        sumStr.insert(sumStr.begin(),intToChar(carry)); 
    } 

    return sumStr; 
}

总结

上述算法通过字符串倒序和对齐累加的方式,完美避开了原生数据类型的溢出限制。该实现涵盖了从预处理、公共位计算到余量补全的所有环节,是学习 C++ 基础算法与实际工程应用结合的典型案例。

以上就是使用C++的string实现高精度加法运算的详细内容,更多关于C++高精度算法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。