Acwing 高精度-1.Acwing 791.高精度加法

时间:2024-10-13 16:41:43

在这里插入图片描述
实现思路:A、B两个整数分别存于a[],b[]。设置一个结数组c[],设置一个进位t,表示两个整数对应位相加时的进位,初始为0,后续每次相加结果为a[i]+b[i]+t。相加结果%10为余数,存入c[i];相加结果/10为进位值即t。

具体实现代码(详解版):

#include <iostream>
#include <vector>

using namespace std;

// A 和 B 存储两个大整数
vector<int> A, B;

// 大整数加法函数,将两个大整数相加,返回结果存储在 vector 中
vector<int> add(vector<int> &A, vector<int> &B) {
    vector<int> C;  // 存储结果
    int t = 0;  // 进位标志,初始为0

    // 循环遍历 A 和 B 的各位,直到最长的那个数组遍历完
    for (int i = 0; i < A.size() || i < B.size(); i++) {
        if (i < A.size()) t += A[i];  // 如果 A 还没遍历完,加上 A[i] 的值
        if (i < B.size()) t += B[i];  // 如果 B 还没遍历完,加上 B[i] 的值

        C.push_back(t % 10);  // 只保留当前位的值(即个位数)
        t /= 10;  // 将进位值保存到 t 中(t > 10 时需要进位)
    }

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

    return C;  
}

int main() {
    string a, b;
    cin >> a >> b;  

    // 将字符串 a 和 b 的每一位数字逆序存入数组 A 和 B 中
    // 例如字符串 "123" 会变为 A = {3, 2, 1}
    for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');  // 将字符转为整数并存入 A
    for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');  // 将字符转为整数并存入 B

    // 调用 add 函数,计算两个大整数的和,结果存入 C
    vector<int> C = add(A, B);

    // 结果 C 是逆序存储的,所以需要逆序输出
    for (int i = C.size() - 1; i >= 0; i--) cout << C[i];

    return 0;  
}