29. Divide Two Integers - LeetCode

Question

29. Divide Two Integers

Solution

题目大意:给定两个数字,求出它们的商,要求不能使用乘法、除法以及求余操作。

思路:说下用移位实现的方法

7/3=2,7是被除数,3是除数
除数左移,假设移动了n次后,移到最接近被除数,这时被除数=被除数-除数,商的一部分为2^n
如果被除数>除数,则继续循环
除数左移,又移动了m次后,移到最接近被除数,这时被除数=被除数-除数,商的一部分为2^m
最后商为2^n+2^m+...

Java实现:

法1:如果可以用除法,一步就可以了

public int divide2(int dividend, int divisor) {    
    // overflows
    if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
    // 给定两个数字,求出它们的商,要求不能使用乘法、除法以及求余操作。
    return dividend / divisor;
}

法2:下面是用减法实现的,执行超时

public int divide2(int dividend, int divisor) {
    // overflows
    if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;

    int ans = 0;
    boolean negative = !((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0));
    dividend = Math.abs(dividend);
    divisor = Math.abs(divisor);
    dividend -= divisor;
    while (dividend >= 0) {
        ans++;
        dividend -= divisor;
    }
    return negative ? -ans : ans;
}

法3:用移位实现

public int divide(int dividend, int divisor) {
    // 防止溢出
    if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;

    // 获取最终结果的符号
    int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
    long dvd = Math.abs((long) dividend);
    long dvs = Math.abs((long) divisor);
    int ans = 0;
    while (dvd >= dvs) {
        long tmp = dvs, multiple = 1;
        while (dvd >= (tmp << 1)) {
            tmp <<= 1;
            multiple <<= 1;
        }
        dvd -= tmp;
        ans += multiple;
    }
    return sign == 1 ? ans : -ans;
}

猜你喜欢

转载自www.cnblogs.com/okokabcd/p/9275479.html