美文网首页
Java 算法-两个整数相除(二分法)

Java 算法-两个整数相除(二分法)

作者: 琼珶和予 | 来源:发表于2018-01-11 09:41 被阅读0次

  每天都要督促自己做面试题!

题意:
将两个整数相除,要求不使用乘法、除法和 mod 运算符。

如果溢出,返回 2147483647 。
样例:
给定被除数 = 100 ,除数 = 9,返回 11。

  这个题说实话,如果直接除以的话,不难的,但是题上说了不能使用乘法和除法,所以只有使用加减法,但是加减法有太慢了,所以想到了位运算,<<1表示左移一位,表示乘以2。

1.解题思路

  我们将被除数循环减去除数(这个是要变得),减过一次,如果被除数>=除数的话,就让除数乘以2(<<1),并且增量也要乘以2,因为倍数原来的两倍。
  我们假设,result 用来记录最终的结果,cnt表示每次的增量,temp表示变换的除数,每次被除数减去temp之后,cnt<<1,同时temp<<1。
  说的我都有点乱了,直接看代码

2.代码

public  int divide(int dividend, int divisor) {
        if(divisor == 0) {
            return 2147483647;
        }
        long result  = 0;
        long d1 = Math.abs((long)dividend);
        long d2 = Math.abs((long)divisor);
        while(d1 >= d2) {
        
            long temp = d2; //变换的除数
            long cnt = 1; //增量
            while(d1 >= temp) {
                //如果被除数大于等于temp(变换的除数),result += cnt
                result += cnt;
                d1 -= temp; //被除数减去除数
                cnt = cnt << 1;
                temp = temp << 1;
            }
        }
        if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) {
            result = -result;
        }
        if(result < Integer.MIN_VALUE || result > Integer.MAX_VALUE) {
            result = 2147483647;
        }
        return (int) result;
    }

相关文章

  • Java 算法-两个整数相除(二分法)

      每天都要督促自己做面试题! 题意: 样例:   这个题说实话,如果直接除以的话,不难的,但是题上说了不能使用乘...

  • 辗转相除法,最大公约数,最小公倍数

    辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公约数的算法。 算法描...

  • 最大公约数

    . 欧几里德算法和扩展欧几里德算法 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。...

  • C++ 辗转相除法 - 求最大公约数

    辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知...

  • Java算法题:两整数相除

    给定两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返...

  • 扩展欧几里得算法

    欧几里得算法 文中用 表示求模运算, 表示整除, 比如 欧几里德算法(称辗转相除法),用于计算两个整数a, b的...

  • 欧几里得算法

    欧几里得算法又称辗转相除法,用于求两个非负整数的最大公约数。

  • 欧几里德与扩展欧几里德算法

    欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,...

  • 算法学习(二):二分法算法

    二分法算法老生常谈,不做解释 注意点:数组要首先有序整数相除不是四舍五入,直接去掉多余的小数部分,所以 low ...

  • 欧几里得算法(辗转相除法)最大公约数

    欧几里得算法原理 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。gcd(a,b)=gcd(b,a...

网友评论

      本文标题:Java 算法-两个整数相除(二分法)

      本文链接:https://www.haomeiwen.com/subject/mhkznxtx.html