谈谈高精度压位的坑

筅森魡賤 提交于 2019-11-27 07:04:53

  有时我们发现要计算的数据非常大,只能用高精度来计算。而高精度的复杂度很大,与位数/开的数组大小成正相关关系,故为了降低复杂度,常常用“压位”的思想,比如一位(一个数组元素)不让它代表一个10进制的数,而是代表一个10000进制的数。这样原来一个100位的数就被压成了25位的数,时间和空间复杂度都有显著提升。

  但对于一个陌生的知识,还是要谨慎使用,以防未预见的坑。

  一般我们把10进制的高精度数转换为B进制的高精度数,为了方便,B一般为较大的10的k次方。对B的选择,既要考虑优秀的压缩位数,又要考虑在进位前的运算时避免溢出数组类型。B进制的数的数位上的数应为0到(B-1),因此数位上的数大于等于B时就应进位(别忘了等于B的情况)。

  数组元素最好从1开始,否则要单独分很多要考虑的特殊情况。

  由于压位后一位代表的数比10大很多,所以要注意数组的大小要能包括计算过程中可能出现的最大位数(不一定是结果的最大位数,在加法或乘法中可能出现计算过程中的最大位数比结果的最大位数还大的情况,注意别数组越界)。

  最坑的一点莫过于输出了。压位后要注意中间0的丢失!因此对非最高位的每位数,不能忽略前导零!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!