如你所见,第一步就是对二者大小的判断,如果被减数比减数小,我们直接改变入参的顺序来改变二者位置。
倘若二者完全一致时cmp返回1,那么再调换位置后,minus函数将继续调用cmp函数来判断二者大小,每次都会返回1,导致无限递归,这就是我们规定完全一致时返回0的原因。
其中我们用c = (a - b + t + 10) % 10;来计算结果的第i位,之所以要+10,是模拟结果为负时向前一位借10的过程,而如果(a - b + t)不为负数,那因为%10的存在,也不会产生影响。
下一行if (a - b + t < 0)也很好理解,若是(a - b + t)为负数,那就需要向前一位借位,那我们就标记t=-1,来影响下一位的结果计算即可。
最后我们需要去除前导0,首先因为运算数都是正整数,所以结果最大位数也就和被减数一样,所以我们从被减数的最高位数开始判断结果c,如果为0,那就把返回的长度len3减去1,而值得注意的是,若是结果只有1位了那就不能减了,因为这意味着结果为0。
那此时我们就已经完成了高精度减法的运算,将结果存入了数组c,但别忘了结果正负的判断: