————致力于用代码改变世界

大整数相加[C++]

0 前言

当我们遇到需要处理非常大的整数的情况时,标准的数据类型如int或long long int可能无法满足需求,因为这些类型的数值范围有限。在这种情况下,我们需要一种方法来处理超出常规数据类型范围的大整数。本文将介绍如何使用C++实现大整数相加。

1 大整数相加的基本原理

从最低位开始逐位相加,并处理进位。由于C++的标准数据类型不足以存储非常大的数,我们可以使用字符串来存储这些大整数。每个字符代表一个数字,通过遍历字符串中的每一位来进行加法运算。

2 实现步骤

2.1 输入处理:

为了方便计算,将这两个字符串反转,较长的在上方,较短的在下方,使得个位对齐,较短的数值高位使用0补充。如下图所示。
image
本文程序还不能够处理负数情况,实现原理并不难,感兴趣的读者可以自行编写。

2.2 加法运算

  1. 初始化一个变量用于保存进位值,例如变量carry。
  2. 从最低位开始,同时遍历两个字符串的每一位,计算当前位的和加上进位值。
  3. 如果当前位的和大于等于10,则设置进位值为1,否则为0。
  4. 当前位的结果为和模10的值。

算法过程如下图所示。你可能会注意到,最长的串长度是6,为什么会有7列?
例如99+99必须要往百位进1,第7列是用于处理这种情况的。
image

3 代码

点击查看代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// 大整数相加函数
string add(string num1, string num2)
{
    //存储空间
    vector<vector<char>> arr(3, vector<char>(max(num1.length(), num2.length()) + 1, '0'));
    string s1, s2;
    if (num1.length() > num2.length())
    {
        s1 = num1;
        s2 = num2;
    }
    else
    {
        if (num1.length() == num2.length())
        {
            s1 = num1 > num2 ? num1 : num2;
            s2 = num1 < num2 ? num1 : num2;
        }
        else
        {
            s1 = num2;
            s2 = num1;
        }
    }

    //反序填充
    reverse(s1.begin(), s1.end());
    for (int a = 0; a < s1.length(); ++a)
    {
        arr[0][a] = s1.at(a);
    }
    reverse(s2.begin(), s2.end());
    for (int a = 0; a < s2.length(); ++a)
    {
        arr[1][a] = s2.at(a);
    }

    //依次计算
    int carry = 0;//进位值
    for (int a = 0; a <= arr.front().size()-1; ++a)
    {
        short v1 = arr[0][a] - '0';
        short v2 = arr[1][a] - '0';
        arr[2][a] = ((v1 + v2 + carry) % 10) + '0';
        carry = (v1 + v2 + carry) / 10;
    }

    //结果反序
    string res("");
    for (int a = arr.front().size() - 1; a >= 0; --a)
    {
        res = res.append(1, arr[2][a]);
    }

    // 去除前导零
    size_t pos = res.find_first_not_of('0');
    if (pos != string::npos)
    {
        res = res.substr(pos);
    }
    else
    {
        res = "0";
    }

    return res;
}

int main()
{
    //相乘的两个整数
    string num1 = "123456";
    string num2 = "898726";
    string ret = add(num1, num2);
    cout << "两个整数和: " << ret << endl;
    return 0;
}
点击查看运行结果
两个整数乘积为: 1022182

D:\Visual Studio 2019\项目\大整数加法\x64\Debug\大整数加法.exe (进程 12336)已退出,代码为 0。
按任意键关闭此窗口. . .
posted @ 2024-11-09 09:11  hello_nullptr  阅读(23)  评论(0编辑  收藏  举报