高精度减法中,假设两个高精度数按低位在前存储,且已经保证被减数不小于减数。下面处理借位逻辑代码中横线处应填入( )。
if (a[i] < b[i]) {
a[i + 1]--;
________________;
}
t = a[i] - b[i];逻辑代数运算:与(∧/×)、或(∨/+)、非(┐/¬)。德摩根律:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。
注意德摩根律的正确应用:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。C++中逻辑运算符有短路求值特性。
【考点】高精度减法|借位处理|整除与余数
【解题思维】高精度减法的核心就是逐位相减,遇到不够减就向高位借 1。因为存储是低位在前,a[i+1] 就是 a[i] 的下一位(即更高位)。借位时,高位 a[i+1] 减 1 已在上行完成,当前位 a[i] 必须补回一个 10 才能正确减去 b[i]。所以横线处只能填 a[i] += 10,这是高数减法借位的唯一正解。
【陷阱拆解】B 选项 a[i] -= 10 把方向反了——借位是增加当前值,不是再减。C 选项改 b[i] 毫无意义,被减数与减数都不该动。D 选项 a[i] = a[i+1] + 10 会直接赋成 10 左右,既破坏了 a[i+1] 的借位结果,又把当前位塞成错误值,属于典型的"偷换变量"陷阱。命题人专门用 a[i] 和 a[i+1] 的相邻关系迷惑考生,但只有 A 同时满足"当前位加 10"和"不破坏高位已减 1"两个条件。
【反命题思维】如果把题目改成高精度加法,横线处会考察进位逻辑(a[i+1]++ 或类似);若把条件改为被减数可能小于减数,就需要先判断并交换两数或处理负号。做这类题前先问:借位到底影响哪一位?方向是加还是减?——答案往往就出来了。