大数加法

组别:入门级
难度:4

模拟竖式计算方法:将将两个高精度数接位拆分后存到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
//A,B为两个正整数
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN=10005; //max number 
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
                                     
void Read(int *arr, int &Len){
    string cur;
    cin>>cur;
    Len=cur.length();
    for(int i=0;i<Len;i++){
        arr[i]=cur[i]-48;
    }
    reverse(arr,arr+Len);
}                                

int main() {
   Read(A,Len_A);
   Read(B,Len_B);
   Len_Ans=max(Len_A,Len_B);
   for(int i=0;i<=Len_Ans;i++){
       Ans[i]=A[i]+B[i]+C[i];
       if(Ans[i]>9){
           C[i+1]++;
           Ans[i]=Ans[i]-10;
       }
   }
    while(Ans[Len_Ans]>0)Len_Ans++;
    for (int i =Len_Ans-1; i>=0;i--)
    {
        cout<<Ans[i];
    }
    return 0;
}                           

洛谷P1601

P1009 [NOIP1998 普及组] 阶乘之和
Scroll to Top