LeetCode | # 29. Divide Two Integers

29. Divide Two Integers

Description

描述:https://leetcode.com/problems/divide-two-integers/description/

Solution: (Java)
class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == Integer.MIN_VALUE) {
            if (divisor == -1)
                return Integer.MAX_VALUE;
        }
        int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1; // ^ 异或,同为假,不同为真
        long ldividend = Math.abs((long)dividend);
        long ldivisor = Math.abs((long)divisor);
        int result = 0;
        while (ldividend >= ldivisor) {
            // 计算二进制中,左移的位数,left-1才是真正移动的位数
            int left = 0;
            while (ldividend >= (ldivisor << left)) {
                left++;
            }
            // 被除数减去最大的数(按照二进制的算法)
            ldividend -= ldivisor << (left-1);
            result += 1 << (left-1);
        }

        if (sign == 1)
            return result;
        else
            return -result;
    }
}
思路

本题题意是两个数的除法,不能用乘除运算,同时考虑溢出的情况,考虑以下几点:

  • 参照人手工进行除法时的操作,只不过在计算机中,是按照二进制来;
  • 溢出的处理、符号的确定、商的计算;
  • 灵活使用^<<运算符,二进制中左移一位为乘于2,右移一位为除于2;
  • 由于int整数对-2^31去绝对值无效,所以通过long长整型来进行运算。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值