大数加法

组别:入门级
难度:4

洛谷:P1601、P1009
OJ平台:P1260,、LD1117、T1173

模拟竖式计算方法:将将两个高精度数接位拆分后存到a[],b[]数组中,再用c[]数组存储进位,通过模拟加法竖式来计算结果。

方法一:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**************************************************************** 
 * 代码作者: Alex Li
 * 创建时间: 2026-05-04 23:15:31
 * 最后修改: 2026-05-04 23:33:39
 * 文件描述: 大数加法
****************************************************************/
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string addBigNumbers(string a, string b) {
    string result = "";
    int i = a.length() - 1; // 指向 a 的末尾
    int j = b.length() - 1; // 指向 b 的末尾
    int carry = 0;          // 进位标识

    // 只要还有位没加完,或者还有进位,就继续循环
    while (i >= 0 || j >= 0 || carry > 0) {
        int sum = carry; // 先加上上一轮的进位

        if (i >= 0) {
            sum += a[i] - '0'; // 将字符转化为整数
            i--;
        }
        if (j >= 0) {
            sum += b[j] - '0';
            j--;
        }

        carry = sum / 10;      // 计算新的进位
        result += (sum % 10) + '0'; // 取个位数转回字符,存入结果
    }
    // 因为是从个位开始加的,所以结果是反的,需要翻转回来
    reverse(result.begin(), result.end());
    
    return result;
}

int main() {
    string num1, num2;
    cin >> num1>> num2;
    string sum = addBigNumbers(num1, num2);
      cout << "相加结果为: " << sum << endl;
    return 0;
}

方法二:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int MAXN = 10005; // 最大数字位数

int A[MAXN], B[MAXN], Sum[MAXN]; // 被加数、加数、和
int Len_A, Len_B, Len_Sum; // 各数字的长度

void ReadNumber(int *arr, int &len) {
    string input;
    cin >> input;
    len = input.length();
    for (int i = 0; i < len; i++) {
        arr[i] = input[i] - '0';
    }
    reverse(arr, arr + len);
}

int main() {
    ReadNumber(A, Len_A);
    ReadNumber(B, Len_B);
    
    Len_Sum = max(Len_A, Len_B);

    // 逐位相加并直接处理进位
    for (int i = 0; i < Len_Sum; i++) {
        Sum[i] += A[i] + B[i]; // 累加到当前位
        
        // 直接处理进位
        if (Sum[i] > 9) {
            Sum[i+1]++;  // 进位到下一位
            Sum[i] -= 10; // 当前位减10
        }
    }
    
    // 检查最高位是否有进位
    if (Sum[Len_Sum] > 0) {
        Len_Sum++;
    }
    
    // 输出结果
    for (int i = Len_Sum-1; i >= 0; i--) {
        cout << Sum[i];
    }
    
    return 0;
}