高精度模板——C++实现

这篇博客介绍了如何实现高精度计算,包括加法、减法、乘法和除法的基本思路,并提出了一种利用压位操作提高效率的方法。作者提供了一个简单的高精度模板,该模板使用C++实现,通过vector存储数字的每一位,支持正负数的运算。博客还讨论了如何处理乘法和除法的复杂情况,并给出了相应的算法。此外,还提到了将每个数字位存储为8位以减少内存占用的技巧。
摘要由CSDN通过智能技术生成

综述

最近闲来无事写了一个比较简单的高精度模板……想来之前没有总结过这一块的知识,就写一篇博客来简单记录一下吧。关于高精度模板的资料其实挺多的,有某个方法不是很理解的话可以再搜搜资料或者自己手动模拟一下。这个模板的效率肯定不是最好的,可能还会有隐藏的bug,仅给大家提供一种实现高精度的思路。

朴素想法

我们先从最简单的开始,如果让你实现一个正数的高精度加法,你会怎么做?大部分人的做法肯定是用数组或者链表来模拟这个过程,以数组为例,从低位到高位依次存储数字的每一位,那么加法无非就是从最低位开始逐位进行加法计算,进行进位。没错,这就是高精度算法的实现思路。不过为了简化算法,我们还需要使用一些技巧。比如,针对加法,我们仅计算同符号的大数相加,若不同符号则视为减法。针对减法,我们仅计算较大的数减去较小的数,然后通过取反运算将其扩展到全部情况。

那么乘法怎么计算呢?类似于竖式乘法,可以把乘数逐位拆分,然后再进行计算。很显然这样做的复杂度是比较高的,也有更加优秀的做法,不过这里就不讨论了~

比较复杂的是除法,这里提供一种思路吧,感觉复杂度还是比较高的。有点逆推的意思,不妨设 a / b = c a/b=c a/b=c,也即 a = b ∗ c a=b*c a=bc,此时把 c c c逐位拆分可得: a = b ∗ c n + b ∗ c n − 1 + … + b ∗ c 0 a=b*c_n+b*c_{n-1}+…+b*c_0 a=bcn+bcn1++bc0。那么只要我们依次(从高位到低位)计算出 c n 、 c n − 1 、 … c_n、c_{n-1}、… cncn1,再把它们拼起来就可以得到 c c c了。显然只要确定了 c i c_i ci的位数,就可以通过减法来模拟出 c i c_i ci的值。这个位数其实是比较容易确定的,如果 a a a x x x位, b b b y y y位,那么 c c c最多有 x − y + 1 x-y+1 xy+1位,逐位模拟即可。

压位

如果每次只存储数字的一位的话,是不是有点浪费?考虑到 l o n g   l o n g long\ long long lon

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值