LeetCode-Divide Two Integers

本文介绍了一种不使用乘法、除法和取余操作实现整数除法的方法。通过两种解法,一种使用加法模拟,另一种使用位运算优化,解决了整数除法的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description:
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:
Input: dividend = 10, divisor = 3
Output: 3

Example 2:
Input: dividend = 7, divisor = -3
Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231−1]. For the purpose of this problem, assume that your function returns 231−1 when the division result overflows.

题意:实现两个整数的除法;需要注意的是要求不可以使用乘法、除法和取余操作;并且结果是向0的方向取整;

第一种解法(超时):我们可以使用加法来模拟乘法,a/b=c,相当于求解b*c=a;我们需要计算要相加多少次才能接近被除数;

class Solution {
    public int divide(int dividend, int divisor) {
        int symbol = 0;
        long _divisor = divisor;
        long _dividend = dividend;
        if(dividend < 0){
            symbol--;
            _dividend = 0 - (long)dividend;
        } 
        else
            symbol++;
        if(divisor < 0){
            symbol--;
            _divisor = 0 - (long)divisor;
        }
        else
            symbol++;
        int quotient = _divisor <= _dividend ? 1 : 0;
        long base = _divisor;
        while(_divisor + base < _dividend){
            quotient++;
            _divisor += base;
        }
        return symbol == 0 ? 0 - quotient : quotient;
    }
}

第二种解法:利用上面的解法会产生超时的可能,因此,我们可以利用位运算来缩短时间,每次将除数左移一位(扩大两倍)与被除数比较,直到移位后的除数小于或等于被除数,此时再将被除数减去移位后的除数再次进行移位比较,最后得到整除的商;

class Solution {
    public int divide(int dividend, int divisor) {
        if(dividend == Integer.MIN_VALUE && divisor == -1){
            return Integer.MAX_VALUE;
        }//the division result overflows
        if(divisor == 0){
            return -1;
        }//divisor is zero
        int symbol = dividend >> 31 == divisor >> 31 ? 1 : -1;//symbol of result
        long _dividend = Math.abs((long)dividend);
        long _divisor  = Math.abs((long)divisor );
        if(_dividend == 0 || _divisor > _dividend){
            return 0;
        }
        int quotient = 0;//the result
        while(_divisor <= _dividend){
            long divisorTemp = _divisor;
            long quotientTemp = 1;
            while((divisorTemp << 1) <= _dividend){
                divisorTemp <<= 1;
                quotientTemp <<= 1;
            }
            quotient += quotientTemp;
            _dividend -= divisorTemp;
        }
        return quotient * symbol;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值