数组 a 和 b 按低位在前的顺序保存两个非负大整数。下面代码实现高精度加法,横线处应填写 ( )。
vector<int> add(const vector<int> &a, const vector<int> &b) {
vector<int> c;
int carry = 0;
int n = max(a.size(), b.size());
for (int i = 0; i < n; i++) {
int sum = carry;
if (i < a.size())
sum += a[i];
if (i < b.size())
sum += b[i];
c.push_back(sum % 10);
____________________
}
if (carry)
c.push_back(carry);
return c;
}高精度加法核心在于逐位相加并处理进位。本题代码已正确计算当前位数字(sum % 10)存入 c,横线处必须更新进位变量。由于 sum 是当前位累加总值(含上一位进位),进位应取 sum 除以 10 的整数部分,即 carry = sum / 10。这是高精度加法最基础的进位规则,后续循环迭代依赖此更新。
选项 A 把进位设为余数,混淆了"当前位数字"与"进位";选项 B 直接赋值 sum,进位会爆炸式增长;选项 D 用刚存入的 c[i] 计算,但 c[i] 已是余数,除以 10 恒为 0,导致后续进位全错。命题人特意把 sum % 10 的写法放在上一行,诱导考生误选 A。
高精度加法核心在于逐位相加并处理进位。本题代码已正确计算当前位数字(sum % 10)存入 c,横线处必须更新进位变量。由于 sum 是当前位累加总值(含上一位进位),进位应取 sum 除以 10 的整数部分,即 carry = sum / 10。这是高精度加法最基础的进位规则,后续循环迭代依赖此更新。
选项 A 把进位设为余数,混淆了"当前位数字"与"进位";选项 B 直接赋值 sum,进位会爆炸式增长;选项 D 用刚存入的 c[i] 计算,但 c[i] 已是余数,除以 10 恒为 0,导致后续进位全错。命题人特意把 sum % 10 的写法放在上一行,诱导考生误选 A。
本题考查《GESP 考试大纲》五级"算法与程序设计"模块中的高精度运算与循环控制。命题人放这道题,就是要卡住考生对"进位更新时机"的理解——绝大多数人知道要进位,但容易把进位和当前位数字搞混。