LeetCode第29题:两数相除

LeetCode第29题:两数相除

  • 题目:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。被除数和除数均为 32 位有符号整数。除数不为 0。假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
  • 解法一:很愚蠢的一种解法。。。。
class Solution {
     
    public int divide(int dividend, int divisor) {
     
        int m=1,i=0;
        if(divisor==0)  return 0;
        if(divisor==1)  return dividend;
        if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
        if(divisor==-1)  return (0-dividend);
        if(divisor<0){
     
            m=0-m;
            divisor=0-divisor;
        }
        if(dividend<0){
     
            m=0-m;
            dividend=0-dividend;
        }
        if(dividend>Integer.MAX_VALUE || dividend<Integer.MIN_VALUE || divisor<Integer.MIN_VALUE ||divisor>Integer.MAX_VALUE) return 0;
        while(true){
     
            dividend=dividend-divisor;
            if(dividend>=0){
     
                i++;
                if(i==Integer.MAX_VALUE+1 && m==-1){
     
                    return Integer.MAX_VALUE;
                }else if(i==Integer.MAX_VALUE && m==1){
     
                    return Integer.MAX_VALUE;
                }
            }else{
     
                break;
            }
        }
        if(m==-1){
     
            i=0-i;
        }
        return i;
    }
}
  • 解法二:因为正数的边界不好算,所以把所有的数变成负数,运用右移两位实现乘2
class Solution {
     
    public int divide(int dividend, int divisor) {
     
        boolean sign = (dividend > 0) ^ (divisor > 0);
        int result = 0;
        if(dividend>0) {
     
            dividend = -dividend;
        }
        if(divisor>0) divisor = -divisor;
        while(dividend <= divisor) {
     
            int temp_result = -1;
            int temp_divisor = divisor;
            while(dividend <= (temp_divisor << 1)) {
     
                if(temp_divisor <= (Integer.MIN_VALUE >> 1))break;
                temp_result = temp_result << 1;
                temp_divisor = temp_divisor << 1;
            }
            dividend = dividend - temp_divisor;
            result += temp_result;
        }
        if(!sign) {
     
            if(result <= Integer.MIN_VALUE) return Integer.MAX_VALUE;
            result = - result;
        }
        return result;
    }
}

作者:luca-zhao
链接:https://leetcode-cn.com/problems/divide-two-integers/solution/zhi-xing-shi-jian-1msji-bai-100-by-luca-zhao/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(学生)