大数加法

组别:入门级
难度:4

洛谷:P1601、P1009
OJ平台: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
48
49
50
51
52
53
54
/**************************************************************** 
 * Description:  大数加法
 * Author: Alex Li
 * Date: 2023-07-07 21:45:54
 * LastEditTime: 2024-01-31 05:06:23
****************************************************************/
#include <iostream>
#include <string>
using namespace std;

// 声明字符串来存储输入数字和数组来逐位存储它们的数字表示
string a1, b1;
int a[101], b[101], c[102];

int main() {
    // 用于存储数字长度和其他实用变量的变量
    int lena, lenb, lenc, i, x;

    cin >> a1; // 输入第一个大数字作为字符串
    cin >> b1; // 输入第二个大数字作为字符串

    lena = a1.length(); // 第一个数字的长度
    lenb = b1.length(); // 第二个数字的长度

    // 将第一个字符串(a1)以相反的顺序转换为整数数组
    // 减去'0'是为了将字符数字转换为整数
    for (i = 0; i < lena; i++) a[lena - i] = a1[i] - '0';

    // 将第二个字符串(b1)以相反的顺序转换为整数数组
    for (i = 0; i < lenb; i++) b[lenb - i] = b1[i] - '0';

    // 初始化加法过程的变量
    lenc = 1; // 和数组(c)的当前索引
    x = 0;    // 用于存储进位的变量

    // 循环直到到达最长数字的末尾
    while (lenc <= lena || lenc <= lenb) {
        c[lenc] = a[lenc] + b[lenc] + x; // 将对应的数字和进位相加
        x = c[lenc] / 10;               // 计算新的进位
        c[lenc] %= 10;                  // 在去除进位后的当前位
        lenc++;                         // 移动到下一位数字
    }

    // 如果在最后一次操作后还有进位,将其加到结果中
    c[lenc] = x;

    // 如果结果数组中的最后一个数字是0,减少结果的长度(以去除前导零)
    if (c[lenc] == 0) lenc--;

    // 以相反的顺序打印结果(因为结果是以相反的顺序存储的)
    for (i = lenc; i >= 1; i--) cout << c[i];

    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;
}

Scroll to Top