任意长整数除法实现:自定义256位Bigint类的最优除法方案问询
256位定长Bigint高效除法实现方案
针对你现在的右对齐定长数组存储的Bigint结构,最优实现方案是移位试商法,时间复杂度仅为O(256),完全避免重复减法的性能问题,而且可以直接复用你已经实现的比较、减法逻辑,适配成本极低。
前置依赖能力(你已经实现/可以快速完成)
- 两个Bigint的大小比较功能
- Bigint的移位操作:你的存储结构是最低位存放在数组下标255处,左移n位等价于把所有有效数组元素向数组下标更小的方向移动n位,空出的尾部下标补0;右移n位等价于向数组下标更大的方向移动n位,空出的头部下标补0
- 已实现的无符号大整数减法功能
核心实现步骤(无符号整除场景,带符号运算单独处理符号位即可)
我们需要计算 商 = 被除数 / 除数,余数 = 被除数 % 除数:
- 边界处理
- 若除数为0,按你的类设计返回错误或者抛出异常
- 若被除数 < 除数,直接返回商为0,余数等于原被除数
- 移位对齐
- 记录移位次数
shift,初始为0 - 循环左移除数,每次左移1位,
shift加1,直到左移后的除数 > 被除数,最后把shift减1,得到最大有效移位次数
- 记录移位次数
- 试商循环
- 初始化商数组全部为0
- 从
shift到0倒序遍历每一位:- 把除数左移当前遍历的位次数值,判断当前被除数是否 >= 移位后的除数
- 条件成立时:执行
被除数 = 被除数 - 移位后的除数,同时把商的第i位(对应你存储结构的数组下标为255 - i)设为1 - 条件不成立时,跳过当前位,商对应位保持0
- 运算结束后,剩余的被除数就是余数,商数组就是符合你存储格式的结果。
存储结构适配优化
因为你用的是固定长度256位的右对齐数组,不需要每次移位都真实修改除数的数组内容:可以在比较、做减法的时候,直接传入移位偏移量,操作数组时对应加上偏移量取值即可,能省去大量数组拷贝的额外开销。
如果需要支持小数运算,只需要在被除数末尾补对应位数的0,继续执行试商逻辑即可,整体逻辑不需要做大的改动。
内容的提问来源于stack exchange,提问作者That_Guy989
相关产品推荐
相关产品推荐

