java - 大整数的底除法和欧几里得除法

标签 java biginteger integer-division

Java 的 BigInteger 类提供截断除法(商和余数)。以此为起点,实现底数和欧几里得除法(商和余数)的最简单和最有效的方法是什么?

最佳答案

基于Soronbe的回答,这里是正确的 Java 语法的实现(不包括 floored divison 的第二个变体):

public BigInteger euclidianDivision(BigInteger a, BigInteger b) {
    return
        a.subtract(
            a.compareTo(BigInteger.ZERO) < 0 ?
                b.subtract(BigInteger.ONE) :
                    BigInteger.ZERO
        ).divide(b)
}

public BigInteger flooredDivision(BigInteger a, BigInteger b) {
    return
        a.add(
            (a.compareTo(BigInteger.ZERO) < 0) != (b.compareTo(BigInteger.ZERO) < 0) ?
                b.subtract(BigInteger.ONE) :
                    BigInteger.ZERO
        ).divide(b);
}

更新: 根据三种除法算法计算余数,其中两种已经在BigInteger中实现(mod用于欧氏除法,remainder用于欧氏除法)截断除法)。要获取地板划分的余数,您可以使用以下实现:

public BigInteger flooredRemainder(BigInteger a, BigInteger b) {
    return
        a.mod(b).subtract(
            b.compareTo(BigInteger.ZERO) < 0 ? BigInteger.ONE : BigInteger.ZERO
        );
}

关于java - 大整数的底除法和欧几里得除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29194545/

相关文章:

java - 多模块项目中的 sonar-maven-plugin : extending sonar. 源

java - 查询 Lucene 索引文件

java - 需要帮助查找分解代码中的错误

performance - 快速硬件整数除法

java - 冒泡排序在 Java 上不起作用,元素不交换

java - 错误 : incompatible types: possible lossy conversion from int to short. 我不知道为什么会收到此错误消息

Java:BigInteger,如何通过OutputStream编写它

java - 将 Big Integer 值转换为八位字节(2s 补充大端)序列,在 Java 中是 8 的倍数

assembly - 就64位除法而言,是否可以在不分支的情况下执行128位/64位除法?

algorithm - 整数除以 7