蓝桥杯C++基础算法-高精度加法

这段代码实现了一个大数加法的功能,适用于处理超出标准整数类型范围的大数。它通过将大数的每一位存储在 vector<int> 中,从低位到高位逐位相加,并处理进位。以下是代码的详细思路解析


1. 问题背景

给定两个大数(以字符串形式输入),目标是计算它们的和。由于这些数可能非常大,超出了标准整数类型的范围,因此需要使用特殊的算法来处理。

2. 代码逻辑解析

(1) 输入大数
string a, b;  // 用于存储用户输入的两个大数(以字符串形式)
vector<int> A, B;  // 用于存储两个大数的每一位(从低位到高位)

cin >> a >> b;  // 输入两个大数
  • 用户输入两个大数,以字符串形式存储在变量 ab 中。

(2) 转换为数字数组
for (int i = a.size() - 1; i >= 0; i--) 
    A.push_back(a[i] - '0');  // 将字符转换为数字('0' 的 ASCII 值为 48)

for (int i = b.size() - 1; i >= 0; i--) 
    B.push_back(b[i] - '0');
  • 将字符串 ab 从低位到高位逐位转换为数字,并存储在 vector<int> 类型的数组 AB 中。

  • 使用 a[i] - '0' 将字符转换为对应的数字。

(3) 大数加法函数
vector<int> add(vector<int> &A, vector<int> &B)
{
    vector<int> C;  // 用于存储结果的数组
    int t = 0;      // 用于存储进位的变量

    // 从低位到高位逐位相加
    for (int i = 0; i < A.size() || i < B.size(); i++)
    {
        if (i < A.size()) t += A[i];  // 如果 A 的当前位存在,加上 A 的当前位
        if (i < B.size()) t += B[i];  // 如果 B 的当前位存在,加上 B 的当前位

        C.push_back(t % 10);  // 当前位的结果(加上进位后的个位数)
        t /= 10;              // 更新进位(十位数)
    }

    // 如果最后还有进位,添加到结果中
    if (t) C.push_back(1);

    return C;  // 返回结果数组
}
  • 输入:两个大数的每一位分别存储在数组 AB 中。

  • 输出:一个数组 C,存储两个大数相加的结果。

  • 逻辑

    1. 初始化

      • 创建一个空数组 C 用于存储结果。

      • 初始化进位变量 t 为 0。

    2. 逐位相加

      • 使用一个循环从低位到高位逐位相加。

      • 如果 AB 的当前位存在,将其值加到 t 中。

      • t % 10 的结果存储到 C 中,表示当前位的结果。

      • 更新进位 t /= 10

    3. 处理最后的进位

      • 如果循环结束后 t 仍然大于 0,说明还有进位,将其添加到 C 中。

    4. 返回结果

      • 返回数组 C,表示两个大数相加的结果。

(4) 输出结果
for (int i = C.size() - 1; i >= 0; i--) 
    cout << C[i];
  • 从高位到低位输出结果数组 C 中的每一位。


3. 示例运行

输入:
12345678901234567890
98765432109876543210
运行过程:
  1. 输入两个大数:

    • a = "12345678901234567890"

    • b = "98765432109876543210"

  2. 转换为数字数组:

    • A = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    • B = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

  3. 调用 add 函数计算结果:

    • C = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]

  4. 输出结果:

    111111111011111111100
输出:
111111111011111111100

4. 总结

这段代码的核心思路是通过逐位相加处理进位来实现大数加法。它将大数的每一位存储在 vector<int> 中,从低位到高位逐位相加,并处理进位,最终得到结果。这种方法适用于处理超出标准整数类型范围的大数。

完整代码

#include <bits/stdc++.h>  // 包含标准库中的所有功能
using namespace std;      // 使用标准命名空间,避免重复写 std::
const int N = 1e6 + 10;   // 定义一个常量,表示最大可能的数字长度(虽然这里未直接使用)

// 定义一个函数,用于实现两个大数的加法
vector<int> add(vector<int> &A, vector<int> &B)
{
    vector<int> C;  // 用于存储结果的数组
    int t = 0;      // 用于存储进位的变量

    // 从低位到高位逐位相加
    for (int i = 0; i < A.size() || i < B.size(); i++)
    {
        if (i < A.size()) t += A[i];  // 如果 A 的当前位存在,加上 A 的当前位
        if (i < B.size()) t += B[i];  // 如果 B 的当前位存在,加上 B 的当前位

        C.push_back(t % 10);  // 当前位的结果(加上进位后的个位数)
        t /= 10;              // 更新进位(十位数)
    }

    // 如果最后还有进位,添加到结果中
    if (t) C.push_back(1);

    return C;  // 返回结果数组
}

int main()
{
    string a, b;  // 用于存储用户输入的两个大数(以字符串形式)
    vector<int> A, B;  // 用于存储两个大数的每一位(从低位到高位)

    // 输入两个大数
    cin >> a >> b;

    // 将字符串 a 转换为数字数组 A
    for (int i = a.size() - 1; i >= 0; i--) 
        A.push_back(a[i] - '0');  // 将字符转换为数字('0' 的 ASCII 值为 48)

    // 将字符串 b 转换为数字数组 B
    for (int i = b.size() - 1; i >= 0; i--) 
        B.push_back(b[i] - '0');

    // 调用 add 函数计算结果
    vector<int> C = add(A, B);

    // 从高位到低位输出结果
    for (int i = C.size() - 1; i >= 0; i--) 
        cout << C[i];

    return 0;  // 程序结束
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值