这段代码实现了一个大数加法的功能,适用于处理超出标准整数类型范围的大数。它通过将大数的每一位存储在 vector<int>
中,从低位到高位逐位相加,并处理进位。以下是代码的详细思路解析
1. 问题背景
给定两个大数(以字符串形式输入),目标是计算它们的和。由于这些数可能非常大,超出了标准整数类型的范围,因此需要使用特殊的算法来处理。
2. 代码逻辑解析
(1) 输入大数
string a, b; // 用于存储用户输入的两个大数(以字符串形式)
vector<int> A, B; // 用于存储两个大数的每一位(从低位到高位)
cin >> a >> b; // 输入两个大数
-
用户输入两个大数,以字符串形式存储在变量
a
和b
中。
(2) 转换为数字数组
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0'); // 将字符转换为数字('0' 的 ASCII 值为 48)
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
-
将字符串
a
和b
从低位到高位逐位转换为数字,并存储在vector<int>
类型的数组A
和B
中。 -
使用
a[i] - '0'
将字符转换为对应的数字。
(3) 大数加法函数
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C; // 用于存储结果的数组
int t = 0; // 用于存储进位的变量
// 从低位到高位逐位相加
for (int i = 0; i < A.size() || i < B.size(); i++)
{
if (i < A.size()) t += A[i]; // 如果 A 的当前位存在,加上 A 的当前位
if (i < B.size()) t += B[i]; // 如果 B 的当前位存在,加上 B 的当前位
C.push_back(t % 10); // 当前位的结果(加上进位后的个位数)
t /= 10; // 更新进位(十位数)
}
// 如果最后还有进位,添加到结果中
if (t) C.push_back(1);
return C; // 返回结果数组
}
-
输入:两个大数的每一位分别存储在数组
A
和B
中。 -
输出:一个数组
C
,存储两个大数相加的结果。 -
逻辑:
-
初始化:
-
创建一个空数组
C
用于存储结果。 -
初始化进位变量
t
为 0。
-
-
逐位相加:
-
使用一个循环从低位到高位逐位相加。
-
如果
A
或B
的当前位存在,将其值加到t
中。 -
将
t % 10
的结果存储到C
中,表示当前位的结果。 -
更新进位
t /= 10
。
-
-
处理最后的进位:
-
如果循环结束后
t
仍然大于 0,说明还有进位,将其添加到C
中。
-
-
返回结果:
-
返回数组
C
,表示两个大数相加的结果。
-
-
(4) 输出结果
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
-
从高位到低位输出结果数组
C
中的每一位。
3. 示例运行
输入:
12345678901234567890
98765432109876543210
运行过程:
-
输入两个大数:
-
a = "12345678901234567890"
-
b = "98765432109876543210"
-
-
转换为数字数组:
-
A = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
B = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
-
-
调用
add
函数计算结果:-
C = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1]
-
-
输出结果:
111111111011111111100
输出:
111111111011111111100
4. 总结
这段代码的核心思路是通过逐位相加和处理进位来实现大数加法。它将大数的每一位存储在 vector<int>
中,从低位到高位逐位相加,并处理进位,最终得到结果。这种方法适用于处理超出标准整数类型范围的大数。
完整代码
#include <bits/stdc++.h> // 包含标准库中的所有功能
using namespace std; // 使用标准命名空间,避免重复写 std::
const int N = 1e6 + 10; // 定义一个常量,表示最大可能的数字长度(虽然这里未直接使用)
// 定义一个函数,用于实现两个大数的加法
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C; // 用于存储结果的数组
int t = 0; // 用于存储进位的变量
// 从低位到高位逐位相加
for (int i = 0; i < A.size() || i < B.size(); i++)
{
if (i < A.size()) t += A[i]; // 如果 A 的当前位存在,加上 A 的当前位
if (i < B.size()) t += B[i]; // 如果 B 的当前位存在,加上 B 的当前位
C.push_back(t % 10); // 当前位的结果(加上进位后的个位数)
t /= 10; // 更新进位(十位数)
}
// 如果最后还有进位,添加到结果中
if (t) C.push_back(1);
return C; // 返回结果数组
}
int main()
{
string a, b; // 用于存储用户输入的两个大数(以字符串形式)
vector<int> A, B; // 用于存储两个大数的每一位(从低位到高位)
// 输入两个大数
cin >> a >> b;
// 将字符串 a 转换为数字数组 A
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0'); // 将字符转换为数字('0' 的 ASCII 值为 48)
// 将字符串 b 转换为数字数组 B
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
// 调用 add 函数计算结果
vector<int> C = add(A, B);
// 从高位到低位输出结果
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0; // 程序结束
}