当前位置: 首页 > 知识库问答 >
问题:

在java中不使用乘法,除法和mod运算符将两个整数除以

蒯华彩
2023-03-14

我写了一个代码,在两个数相除后求出商,但不使用乘法、除法或mod运算符

我的代码

public int divide(int dividend, int divisor) {

    int diff=0,count=0;
    int fun_dividend=dividend;
    int fun_divisor=divisor;
    int abs_dividend=abs(dividend);
    int abs_divisor=abs(divisor);

    while(abs_dividend>=abs_divisor){
        diff=abs_dividend-abs_divisor;

        abs_dividend=diff;
        count++;

    }

    if(fun_dividend<0 && fun_divisor<0){
        return count;
    }
    else if(fun_divisor<0||fun_dividend<0) {
        return (-count);
    }

    return count;

}

我的代码通过了像分红=-1、除数=1或分红=1和除数=-1这样的测试用例。但是它不能通过像分红=--2147483648和除数=-1这样的测试用例。但是当两个输入都是负数时,我有一个if语句。

  if(fun_dividend<0 && fun_divisor<0){
        return count;
    }

当我的输入为-2147483648和-1时,它返回零。我调试了代码,发现它无法到达while循环的内部语句。它只是检查while循环并终止并执行

 if(fun_dividend<0 && fun_divisor<0){
        return count;
    }

很明显,两个输入都是负数,所以我用的是数学。abs功能使其为正。但是,当我试图看到变量abs_distribution和abs_divisior的值时,它们会显示负值。

最大整数可以是9位数。那么我怎样才能通过这个测试用例呢?根据这个测试用例,股息是一个10位数,对于整数范围无效。

根据测试用例,我得到的输出应该是2147483647。

我如何解决这个错误?

提前谢谢你。

共有3个答案

余弘新
2023-03-14

使用调试器运行,发现abs_dividend-2147483648。

然后在的比较而(abs_dividend

事实证明,Javadoc中对Math的解释是正确的。abs(int a)

请注意,如果参数等于Integer的值。MIN_值,最负的int值,结果是相同的值,是负数。

MAX_VALUE是2147483647,因此无法用int表示正2147483648(注意:2147483648将是整数。MAX_VALUE1==整数。MIN_VALUE

邓丰
2023-03-14

我是这样解决的。如果左移时有可能溢出,请优先选择数据类型long而不是int。在一开始就处理边缘情况,以避免在过程中修改输入值。该算法基于我们在学校使用的除法技术。

public int divide(int AA, int BB) {
    // Edge case first.    
    if (BB == -1 && AA == Integer.MIN_VALUE){
        return Integer.MAX_VALUE;   // Very Special case, since 2^31 is not inside range while -2^31 is within range.
    }
    long B = BB;
    long A = AA;

    int sign = -1;
    if ((A<0 && B<0) || (A>0 && B>0)){
        sign = 1;
    }
    if (A < 0) A = A * -1;
    if (B < 0) B = B * -1;

    int ans = 0;
    long currPos = 1; // necessary to be long. Long is better for left shifting.
    while (A >= B){
        B <<= 1; currPos <<= 1;
    }
    B >>= 1; currPos >>= 1;
    while (currPos != 0){
        if (A >= B){
            A -= B;
            ans |= currPos;
        }
        B >>= 1; currPos >>= 1;
    }
    return ans*sign;
}
督冠玉
2023-03-14

尝试使用位操作,如下所示:

public static int divideUsingBits(int dividend, int divisor) {
        // handle special cases
        if (divisor == 0)
            return Integer.MAX_VALUE;
        if (divisor == -1 && dividend == Integer.MIN_VALUE)
            return Integer.MAX_VALUE;

        // get positive values
        long pDividend = Math.abs((long) dividend);
        long pDivisor = Math.abs((long) divisor);

        int result = 0;
        while (pDividend >= pDivisor) {
            // calculate number of left shifts
            int numShift = 0;
            while (pDividend >= (pDivisor << numShift)) {
                numShift++;
            }

            // dividend minus the largest shifted divisor
            result += 1 << (numShift - 1);
            pDividend -= (pDivisor << (numShift - 1));
        }

        if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) {
            return result;
        } else {
            return -result;
        }
    }
 类似资料:
  • 问题内容: 我可以看到这对于新程序员来说是一个普遍的问题,但是我没有成功实现我的代码的任何解决方案。基本上,我想将w和v除,必须将其保存到double变量中。但它打印[0.0,0.0,…,0.0] 问题答案: 此行分几步进行 换句话说,精度在转换为两倍之前已经消失了,您需要先转换为两倍,所以 这迫使Java在整个过程中都使用double数学,而不是使用整数数学,然后在最后转换为double

  • 查看编译器生成的x86程序集,我注意到(无符号)整数除法有时被实现为整数乘法。这些优化似乎遵循以下形式: 例如,执行除以9: 除以3将使用与<code>0x55555555 1</code>的乘法,依此类推。 利用< code>mul指令将结果的高部分存储在< code>edx寄存器中这一事实,可以使用与幻值的单次乘法来获得除法的最终结果。(尽管这种优化有时在最后与逐位移位结合使用。) 我想了解一

  • 我有个愚蠢的问题。我想划分一个java.lang.Integer数组,并将结果保存到一个java.lang.Double数组中。我在Internet上搜索,但没有找到有用的信息(大部分关于Java.lang.Integer类的搜索都导致了原始类型int操作,如Java的整数除法和Java的整数除法)。 我下面的代码不起作用 对于java.lang.Integer(或者更一般的Number类和其他基

  • 如果不使用,,,,,运算符,您将如何将数字除以3? 该号码可以是签名的或未签名的。

  • 我想要一个函数 例如,我们有, 或者在代码中,其中 和 是 32 位有符号整数: 这里有一个棘手的部分:如何有效地实现这一功能(不使用更大的64位值),并且不使用诸如

  • 霍尼韦尔DPS8计算机(和其他计算机)有一条“除分数”指令: “此指令将71位分数除数(包括符号)除以36位分数除数(包括符号),形成36位分数商(包括符号)和36位分数余数(包括符号)。余数的第35位对应于被除数的第70位。除非余数为零,否则余数符号等于被除数符号。” 据我所知,这是整数除法,小数点在左边。 (我确实在白天将整数数学进行了前移,但我对这些技术的记忆在时间的迷雾中消失了。) 要在D