下面的 C++ 代码使用数组模拟整数加法,可以处理超出大整数范围的加法运算。横线处应填入代码是( )。
vector<int> operator + (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 = t + a[i];
if(i < b.size()) t = t + b[i];
_____________________________
}
if(t) c.push_back(t);
return c;
}这题就是大数模拟加法,循环里 t 已经累加完当前位和进位了,横线上只要把 t 的个位存进结果、再把剩下的作为新进位赋给 t 即可,直接看选项里谁同时做了取模和整除就能秒杀。
学生最容易犯的错就是只记得取模求个位,看到 t 就下意识写 t=t%10,结果进位丢了导致后面全错;或者把除法的商当成当前位存进去,逻辑完全颠倒。还有一种情况是只填了 push_back 没改 t,导致下一轮计算用的还是旧进位,程序会一直把同一位数字重复加进去,结果位数爆炸。
【考点】大数加法模拟|进位处理
这道题考查的是 GESP 五级里非常经典的“数组模拟大整数运算”知识点。命题人专门把运算符重载包装成 vector 加法,其实就是想看看你懂不懂大数加法的底层逻辑。在真实比赛中,这种题往往不会直接给两个大数让你算,而是藏在函数重载、模拟运算或者字符串处理里,但核心永远就那两步:当前位怎么算、进位怎么传。
我们先看代码里已经写了什么。循环变量 i 从 0 开始,只要 a 或 b 还有元素就会继续。每次循环里,先把 a[i](如果存在)加到 t 上,再把 b[i](如果存在)加到 t 上。这时候的 t 是什么?它是当前位的数字加上上一轮留下的进位,也就是这一位完整的和。
现在问题来了:t 是个两位数甚至三位数,比如 15 或者 28。我们要把它拆成两部分:个位要存进结果数组 c,十位(也就是进位)要留给下一轮用。怎么拆?C++ 里取余 t%10 就是个位,整除 t/10 就是进位。所以横线上必须同时做这两个动作:先把 t%10 塞进 c,再把 t/10 赋给 t。
看选项,A 选项只做了 t=t%10,进位丢了,下一轮 t 永远是 0 或者只有个位,肯定错;B 和 C 选项把 t/10 当成当前位存进去了,逻辑完全反了;只有 D 选项同时做了 push_back(t%10) 和 t=t/10,这才是正确的做法。
再仔细想想命题人为什么这么挖坑。他故意把取模和整除混在一起,利用学生“只记得取模求个位”的肌肉记忆,诱导选 A。如果你只背结论、不理解进位必须同时更新,就会踩这个坑。还有一种陷阱是循环条件 i<a.size()||i<b.size(),这意味着即使一个数短了,只要另一个数还有位,循环还会继续,这时候要判断 i<b.size() 再取 b[i],代码里已经写了,所以不用管。最后循环结束后,如果 t 不为 0,还要再 push_back(t),因为最高位的进位不能丢,代码里也给了,所以不用改。
从考频趋势来看,复合类型、一维数组、STL 容器基础这些知识点在 GESP 五级里都是高频考点,尤其是模拟类题目,近三年(2024-2026)每年都有十几道,说明命题人很看重学生的手写模拟能力。这类题通常不会考特别复杂的算法,但会考细节,比如进位、借位、末尾补零等。未来如果继续考,可能会把运算符重载换成减法或乘法,或者把 vector 换成字符串,但核心逻辑不变:当前位怎么算、进位怎么传,这两步缺一不可。
所以,拿到这种题,先想清楚:当前位求什么?进位怎么传?这两步缺一不可。然后看选项里谁同时做了这两个动作,就能秒杀。