高精度算法——加、减、乘、除

高精度加法

~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--

  1. C[lc]==0:当前最高位是 0,需要去掉
  2. 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的时候

高精度除法

相关推荐
liliangcsdn1 小时前
基本面因子计算的示例分析
算法
Lyyaoo.2 小时前
【动态规划】【待更新】
java·数据结构·算法
AgentMaster2 小时前
开源智能客服系统技术对比:从架构设计到生产部署的实战指南
大数据·人工智能·算法
weixin_307779132 小时前
C++代码实现MATLAB中的ode23t函数功能
开发语言·c++·算法·matlab
萧西待水2 小时前
奥赛一本通 1451 棋盘游戏
算法·宽度优先
Niuguangshuo2 小时前
论文解读:Paraformer,非自回归中文 ASR 的并行 Transformer
算法·音视频·语音识别
鹿角片ljp3 小时前
LeetCode 78:子集|回溯、选与不选、递归和path快照
java·数据结构·算法
hansang_IR3 小时前
【代数与组合数学 | 那忘算 5】生成函数 & 例题 & 卷积
c++·算法·多项式·生成函数·母函数
Zane19943 小时前
快速排序凭什么叫"快"排序?平均O(nlogn)背后,藏着一个能让它退化成O(n²)的选择
算法