美文网首页
LeetCode 第 29 题:两数相除

LeetCode 第 29 题:两数相除

作者: 放开那个BUG | 来源:发表于2024-02-26 16:13 被阅读0次

1、前言

题目描述

2、思路

假如 a/b,求一个商最简单的方法是,在[0, a) 范围内不断的二分,然后用二分位置的数 mid * b,如果 mid * b 最接近 a,那么乘积就是他们的商。
而题目要求不能用乘法,所以模拟了一个位数乘法,实现原理是:6 * 7 = 6 * (4 + 2 + 1),(4 + 2 + 1)是7二进制上的1.

3、代码

class Solution {
    public int divide(int a, int b) {
        long x = a, y = b;
        boolean isNeg = false;
        if ((x > 0 && y < 0) || (x < 0 && y > 0)) isNeg = true;
        if (x < 0) x = -x;
        if (y < 0) y = -y;
        long l = 0, r = x;
        while (l < r) {
            long mid = l + r + 1 >> 1;
            if (mul(mid, y) <= x) {
                l = mid;
            } else {
                r = mid - 1;
            }
        }
        long ans = isNeg ? -l : l;
        if (ans > Integer.MAX_VALUE || ans < Integer.MIN_VALUE) return Integer.MAX_VALUE;
        return (int)ans;
    }

    private long mul(long a, long k){
        long ans = 0;
        while(k > 0){
            if((k & 1) == 1){
                ans += a;
            }
            k >>= 1;
            a += a;
        }
        return ans;
    }
}

相关文章

网友评论

      本文标题:LeetCode 第 29 题:两数相除

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