高精度加法


✅ ~i 就是 i>=0 的简写,很多高精度模板喜欢这么写。

高精度减法


高精度减法「处理前导零」
while(lc && C[lc]==0) lc--; //处理前导0
比如计算
1314 - 793 = 521数组 C 存的是:
C[0]=1,C[1]=2,C[2]=5,C[3]=0
lc一开始是 max 长度 = 4,也就是lc=3。
什么是前导零?
正常数字不会写 0521,前面多余的 0 叫前导零。 因为我们数组是倒着存数字:
- C 下标大的地方,对应数字高位。
- 高位算完之后,可能残留一堆 0,这些就是前导零。
例子:
C[3]=0,C[2]=5,C[1]=2,C[0]=1
数字:0 5 2 1 → 实际是521,高位这个0要删掉
lc代表当前结果的最高位下标。我们输出的时候是从 lc 往 0 倒序打印:
for(int i=lc; ~i; i--) printf("%d",C[i]);
如果lc还是 3,就会输出0521,不对。所以要把lc往前移动,跳过高位的 0。
拆解 while 条件 while(lc && C[lc]==0)
while( 条件 ),满足就执行lc--
C[lc]==0:当前最高位是 0,需要去掉lc:等价于lc != 0,防止结果是 0 的时候,lc 变成 - 1
比如
1000 - 1000 = 0,数组 C 全部是 0。 如果没有lc这个判断,循环会一直 lc-- 到 - 1,后面循环输出for(i=lc;~i;i--)就炸了。
一句话总结
从最高位开始,不断砍掉高位多余的 0,一直保留到第一个非 0 数字;
如果全部是 0,lc 停在 0,保证最后输出 0。

高精度乘法


处理前导零的情况:当有一个乘数为0的时候

高精度除法


