vector<int> add(vector<int> &A, vector<int> &B){
// 为了方便计算,让A中保存较长的数字, B中保存较短的数字
if(A.size() < B.size()) return add(B, A);
// 保存结果的数组
vector<int> C;
// 进位,开始时是0
int t = 0;
// 依次计算每一位
for(int i = 0; i < A.size(); i ++ ){
t += A[i]; // 加上 A 的第 i 位上的数字
if(i < B.size()) t += B[i]; // 加上 B 的第 i 位上的数字
C.push_back(t % 10); // C 中放入结果
t /= 10; // t 更新成进位
}
// 最后如果进位上有数,放进结果数组
if(t) C.push_back(t);
return C; // 返回结果
}
这个函数是用来实现大数加法的,其中大数以 vector<int>
的形式表示,每个元素代表一个数字位,向量的第 0 位存储的是数值的最低位(个位),向量的最后一位存储的是数值的最高位。这种表示方法让你能够处理远远超过标准整数类型限制的大数。下面是对这个函数的结构分析:
函数签名
- 返回类型:
vector<int>
,表示两个大数相加的结果。 - 输入参数:两个
vector<int>
类型的引用 A 和 B,分别表示两个大数。使用引用是为了避免不必要的复制,提高效率。注意,这里传递的是常量引用,意味着函数内部不能修改 A 和 B。
函数体
-
调整 A 和 B 的顺序:如果 A 的长度小于 B,则递归调用
add(B, A)
。这样做确保 A 始终是两个中较长的一个,简化后续的加法操作。 -
初始化结果向量 C 和进位变量 t:创建一个空的向量 C 来保存加法的结果,初始化进位变量 t 为 0。
-
遍历 A 并逐位相加:通过一个循环遍历 A 的每一位,将当前位 A[i] 加到进位 t 上。如果当前的索引 i 小于 B 的长度,也将 B[i] 加到 t 上。这样做是因为 B 可能比 A 短,所以只有当 i 有效时才添加 B 的相应位。然后,将
t % 10
(即当前位的和的个位数)加入到 C 中,并更新 t 为t / 10
(即下一位的进位值)。 -
处理最后的进位:循环结束后,如果进位 t 不为 0,说明最高位相加产生了新的进位,需要将这个进位加到结果向量 C 的末尾。
-
返回结果:返回向量 C,即两个大数相加的结果。