高精度加法

高精度加法实现

在处理大整数运算时,直接使用内置的数据类型可能会导致溢出,因此需要使用字符串或数组来存储大整数,并逐位进行运算。本文将介绍如何使用C++实现高精度加法。

代码实现

以下是一个实现高精度加法的完整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
#include <bits/stdc++.h> // 包含所有标准库的头文件

using namespace std;

vector<int> a; // 存储第一个大整数
vector<int> b; // 存储第二个大整数
string s1, s2; // 存储输入的两个大整数字符串

// 实现两个大整数的加法函数
vector<int> add(vector<int> a, vector<int> b) {
if (a.size() < b.size()) return add(b, a); // 确保 a 的长度大于或等于 b

vector<int> c; // 存储结果的向量
int t = 0; // 进位

// 遍历较长的向量 a
for (int i = 0; i < a.size(); ++i) {
t += a[i]; // 累加 a 的当前位
if (i < b.size())
t += b[i]; // 如果 b 还有对应的位,则累加 b 的当前位
c.push_back(t % 10); // 将当前位的结果存入 c
t /= 10; // 更新进位
}

// 如果有剩余的进位,则加入结果
if (t)
c.push_back(t);

return c;
}

int main() {
// 读取两个大整数的字符串
cin >> s1 >> s2;

// 将字符串转换为向量,低位在前
for (int i = s1.size() - 1; i >= 0; --i)
a.push_back(s1[i] - '0');
for (int i = s2.size() - 1; i >= 0; --i)
b.push_back(s2[i] - '0');
//在C++中,字符(char)和整数(int)之间有一定的对应关系。具体来说,字符 '0' 到 '9' 的ASCII值分别是48到57。为了将字符 '0' 到 '9' 转换为对应的整数0到9,需要减去字符 '0' 的ASCII值。这是因为字符 '0' 的ASCII值是48,所以减去48就得到了对应的整数值。

// 计算两个向量的和
auto ans = add(a, b);

// 逆序输出结果
for (int i = ans.size() - 1; i >= 0; --i)
printf("%d", ans[i]);

return 0;
}

示例输入输出

以下是一些示例输入和对应的输出,帮助理解代码的工作原理。

示例 1

输入:

1
2
12345678901234567890
98765432109876543210

输出:
1
111111111011111111100

示例 2

输入:

1
2
50000000000000000000
50000000000000000000

输出:
1
100000000000000000000

示例 3

输入:

1
2
99999999999999999999
1

输出:
1
100000000000000000000

代码说明

输入处理:

  • 使用字符串 s1s2 分别存储输入的两个大整数。
  • 将字符串转换为倒序存储的整数数组 ab

加法实现:

  • 函数 add 实现两个大整数的逐位加法,考虑进位情况。

主函数逻辑:

  • 将两个字符串转换为整数数组,并确保 a 的长度大于或等于 b
  • 计算两个向量的和,并逆序输出结果。
作者

Xiongyuqi

发布于

2024-05-30

更新于

2024-05-30

许可协议

评论